Pycraft, 3D-видеоигра с открытым исходным кодом и открытым миром, созданная на Python с помощью Pygame, Numpy и PyOpenGL.

В этой статье, публикуемой в начале каждого месяца, рассказывается, какие изменения были внесены в проект, с какими проблемами мы столкнулись и как мы их преодолели, а также как и где вы можете установить этот проект. Для тех, кому интересно, это будет сопровождать еженедельные обновления Pycraft, публикуемые еженедельно в пятницу на моей странице в Твиттере (@PycraftDev в Твиттере: twitter.com/PycraftDev) под #PycraftTJ. Я Том Джеббо, ведущий разработчик и графический дизайнер, и я надеюсь, что вам понравится и играть в игру, и читать эту статью!

Прежде всего, я считаю правильным начать с обсуждения того, как будет построена эта статья. Мы начнем с обсуждения основных функций предстоящего выпуска, дополненного несколькими фрагментами кода, проблемами и тем, как мы их преодолели. Затем статья перейдет к более мелким функциям, которые будут менее заметны, но есть в финальном выпуске обновления, которое будет называться QuickBits. Давай начнем!

Содержание

  • Выделите особенности
  • - Изменение размера дисплея и поддержка полноэкранного режима
  • - Тестовый режим
  • - Графический интерфейс кредитов
  • - Звуки ходьбы и игры
  • - Экран загрузки
  • QuickBits
  • Лента новостей
  • Заключительные слова
  • Ссылки и кредиты

Изменение размера дисплея и поддержка полноэкранного режима

Pycraft изначально был настроен на определенное разрешение (1280x720). Это упрощает программирование игры, так как каждой визуальной функции необходимо задать координату для появления на экране (начиная с 0,0 сверху слева). Однако это представляет собой проблему, когда игра будет казаться намного меньше, чем предполагалось, на больших дисплеях, а в современном мире дисплеи могут быть намного больше, чем 720p, поэтому мы решили разрешить изменение размера игры, чтобы противостоять этому, и поскольку мы реализуя эту функцию, мы подумали о себе; «Почему бы также не добавить в игру поддержку полноэкранного режима?». Таким образом, в дополнение к изменению размера экрана вы также можете нажать F11 во всех графических интерфейсах и меню в игре, чтобы изменить размер окна в соответствии с вашим размером экрана. Это представляет собой проблему, так как нормально иметь самоизменяющийся размер физического окна, но это не означает, что остальные объекты в графическом интерфейсе будут делать то же самое, поэтому, получая размер дисплея во всех игровых циклах, используя синтаксис:

realWidth, realHeight = pygame.display.get_window_size()

Затем мы можем использовать математику для изменения размера и перемещения объектов во всех графических интерфейсах в соответствии с разрешением, на которое изменена игра. Мы достигли этого, используя коэффициенты масштабирования. Поскольку игра изначально была запрограммирована на заданное разрешение, мы можем просто вычислить масштабный коэффициент ширины и высоты экрана и соответствующим образом сместить все, как показано ниже:

yScaleFact = реальная высота/720

xScaleFact = реальная ширина/1280

Тогда это простая, хотя и повторяющаяся задача применения этого коэффициента масштабирования в дополнение к другим формам масштабирования в некоторых обстоятельствах, чтобы заставить все динамически изменяться при изменении размера дисплея, чего мы можем достичь, - при создании дисплея - добавив pygame.RESIZE синтаксис. Хотя все это относительно просто, для этого нужно обновить множество графических интерфейсов и масштабировать много графики, что занимает много времени. В дополнение к этому, как указано ниже в QuickBits, вся соответствующая графика, которая не была удалена, также была соответствующим образом масштабирована. Кроме того, у изменения размера экрана есть еще один недостаток: он обновляется с помощью синтаксиса: pygame.display.update() или pygame.display.flip(). и то, как Windows обрабатывает графику (начиная с рисования сверху слева вверх и продвигаясь вниз в том стиле, который диктуется буквой «p» в разрешении (например, 720p)) приводит к некоторым интересным результатам, которые можно увидеть в этом видео здесь:

www.youtube.com/watch?v=HMkpOzduUyw

Кроме того, в попытке предотвратить намеренное или случайное изменение размера игры людьми, игра будет; при перетаскивании до меньшего, чем исходное соотношение (1280x720), вернитесь к этому как к наименьшему размеру экрана, поддерживаемому игрой в настоящее время.

Тестовый режим

Новое обновление игры, версия 0.9, будет включать в себя три новых графических интерфейса, достижения, настройку персонажа и режим тестирования, однако первые два не будут полностью представлены в предстоящем обновлении из-за того, что они мало используются как Pycraft 0.10, предполагаемый обновление для основного игрового раздела, который будет переработан, еще не прибыло, поэтому достижения нельзя заработать, и в настоящее время нет персонажей, которые можно настроить, однако они будут обновлены после Pycraft 0.10, чтобы добавить эти новые функции, однако на данный момент проекты и идеи были опробованы для обоих графических интерфейсов.

Затем близится к завершению тестовый режим, который был сосредоточен в основном из трех, он включает в себя короткий тест чтения и записи файла, прежде чем сосредоточиться на тесте рендеринга с рядом частот кадров, от 15 кадров в секунду до более чем 400, начиная с простого теста пустого экрана, затем добавляя элементы рисования и, наконец, короткий тест OpenGL, чтобы дать представление о производительности, которую вы, вероятно, получите, используя эту игру. В настоящее время игра оптимизирована для использования с одним ядром, поэтому частота процессора предпочтительнее, чем количество ядер, и игра может работать на очень низком оборудовании с более медленным хранилищем. Таким образом, тестовый режим даст вам представление о производительности, которую может дать ваше устройство (которой будет много на большинстве устройств, которые я добавлю), но это все, что он делает?

Неа! В дополнение к предоставлению пользователю информации о производительности, которую вы, вероятно, получите, он также может порекомендовать, какие настройки вы используете, а также в будущем будет привязан к настройке адаптивной производительности в графическом интерфейсе настроек, который предложит вам чтобы выбрать визуальные эффекты или производительность, и будет динамически изменять настройки игры для вас, когда вы играете, чтобы соответствовать любому профилю. Однако это на будущее и не будет включено в это предстоящее обновление.

Графический интерфейс кредитов

Графический интерфейс кредитов также является областью игры, на которую повлияет это большое обновление, этот графический интерфейс будет изменен с предыдущего стиля, с Pycraft v0.8 и обратно на новый, более современный стиль, это функция, которая также находится в середине реконструкции, поэтому нет хороших фотографий, которыми я мог бы поделиться с вами в настоящее время, однако это будет более глубокий и актуальный взгляд на людей, модули и ресурсы, которые помогли осуществить этот проект, в дополнение к более актуальный список изменений. Графический интерфейс, как и в Pycraft v0.8, будет автоматически прокручиваться вверх, однако теперь текст будет корректно масштабироваться при изменении размера экрана и будет включать в себя изображения фирменных знаков компаний, которые помогли реализовать этот проект, представленные в более удобном для пользователя формате. дружественный, визуально привлекательный способ.

Звуки ходьбы и игры

Последние несколько обновлений включали звуки щелчков при нажатии кнопок или взаимодействии с некоторыми элементами дисплея, однако это обновление включает небольшое изменение, расширяющее эту концепцию. В графическом интерфейсе основной игры (который находится в центре внимания v0.10) теперь есть звуки шагов при ходьбе и звуки приземления после прыжка, это небольшое прикосновение, которое делает игру более захватывающей, кроме того, игра теперь может выбирать случайным образом звук шагов из 6 вариантов, добавляющий игре дополнительную глубину деталей.

Способ воспроизведения и сэмплирования звука теперь отличается, в Pycraft v0.8 все звуки полностью загружаются в память при загрузке игры. Теперь звуки просто сэмплируются с запоминающего устройства, когда они нужны; через синтаксис: pygame.mixer.music.load(soundFILE) и бит за раз, это делает его более эффективным с точки зрения использования памяти для тех, кто работает на машинах с малым объемом памяти. Сэмплированные звуки также теперь классифицируются по каналам с помощью Pygame; Синтаксис pygame.mixer.Channel(num) означает, что, в отличие от предыдущих версий, несколько звуков могут воспроизводиться одновременно друг с другом, создавая более цельный опыт.

Экран загрузки

Экран загрузки Pycraft какое-то время казался довольно устаревшим, со старой оранжевой, серой и темно-серой цветовой палитрой, однако теперь основной экран загрузки был преобразован. Вместо того, чтобы отображать изображение с полосой загрузки и текстом-заставкой, теперь оно отрисовывается в каждом аспекте экрана, что повышает общую плавность тем и изменений цвета.

В дополнение к этому, обратная часть длинных экранов загрузки, короткий экран загрузки также был удален из-за того, как быстро загружается игра, более короткий экран загрузки мог вызвать проблемы с мигающими цветами, которые могли быть опасны для некоторых пользователей, поэтому теперь они сняты с производства.

Теперь мы рассмотрели несколько основных функций, я думаю, пришло время взглянуть на некоторые из более чем 40 небольших функций, которые включает это обновление игры. Пришло время для QuickBits:

QuickBits

  • Давайте начнем со скриншотов, изначально в Pycraft v0.8 это было достигнуто с помощью следующего синтаксиса:

myScreenshot = pyautogui.screenshot(region=((0, 0, ширина, высота)))

мой Скриншот.save(filePATH)

Это хорошо работает, когда дисплей находится в полноэкранном режиме, где изображение представляет собой просто весь экран, однако все становится немного сложнее, когда делается снимок экрана, когда он находится в оконном режиме, потому что пользователь мог перетащить его. вокруг, поэтому мы должны использовать гораздо более сложную установку здесь. Однако есть один досадный недостаток: ни один из этих методов не работает, когда графический интерфейс не находится на основном дисплее.

  • Теперь давайте обсудим производительность. Первоначально Pycraft v0.1, первый стабильный выпуск Pycraft был намного медленнее, чем более поздние версии, поскольку каждое обновление включает улучшения производительности, улучшенное время загрузки, а также ожидаемую частоту кадров. Pycraft v0.9 не является исключением из этого правила, однако некоторые части игры стали намного быстрее. Изображения можно загружать и хранить менее чем в два раза быстрее, чем раньше; Синтаксис .convert(). Звук сэмплируется и загружается не полностью, что улучшает использование игровой памяти. И, наконец, время запуска игры было значительно сокращено, так как раньше игра проверяла наличие всех ресурсов, необходимых игре, прежде чем отправить вас в соответствующую начальную точку, теперь игра делает это, но только при запуске. игру в первый раз в этот день и когда игра не закрылась должным образом, как способ безопасной проверки целостности файла.
  • Мышь является важным аспектом повседневных вычислений, и теперь мышь поддерживается в играх, в Microsoft Windows мышь превращается из указателя в руку при наведении курсора на что-то, на что можно нажать, то же самое теперь верно и для Pycraft. Мышь изменится на руку при наведении курсора на интерактивный текст, отобразит таймер яйца или значок загрузки, когда часть игры загружается, а также изменится на перекрестие в игре!
  • Динамическая производительность: когда обнаруживается, что игра находится в свернутом режиме, она автоматически снижает максимальный FPS, на котором может работать игра, до 15 по сравнению с ранее установленным значением, а также приостанавливает любой воспроизводимый в данный момент звук. Это сделано для увеличения срока службы батареи на устройствах с батарейным питанием, а также для того, чтобы быть менее навязчивым при воспроизведении звука и использовании производительности, когда игра свернута.
  • Вся графика в игре, занимающая весь экран, теперь обновляется путем переключения с загрузки изображений в Pygame на их загрузку в PIL (Pillow или Python Imaging Library), это снижает скорость загрузки графики, но вводит ленивую загрузку. в игру (графика загружается только тогда, когда она необходима, а не сразу), это изменение появилось, поскольку PIL вводит возможность растягивать и изменять размер изображений, которые должны соответствовать полному дисплею, поскольку дисплей больше не привязан к своему ( разрешение 1280x720p). Изображения, которые не занимают весь экран, по-прежнему загружаются с более быстрой и улучшенной загрузкой Pygame.
  • Когда ваш графический интерфейс настроек и высота окна игры составляет от 720 до 760 пикселей по высоте, некоторые меню настроек не отображаются в окне, поэтому была добавлена ​​​​полоса прокрутки, чтобы вы могли теперь прокручивать настройки, находясь в этом режим, чтобы увидеть эти настройки, это не применяется, когда игровой дисплей достаточно большой, чтобы вместить все меню настроек.
  • Стартовое меню, графический интерфейс, который показывает, когда игра запускается в первый раз или когда был обнаружен сбой и игра пыталась восстановить себя, теперь также были обновлены, теперь это позволяет сделать анимацию более плавной, а также чтобы операционная система не думала, что приложение не отвечает, как это было в предыдущих версиях.
  • Это более второстепенная функция, когда несколько экземпляров игры запускаются в исполняемой версии (.exe) или когда игра работает в скомпилированном состоянии, когда они оба пытаются изменить файлы игры, это может привести к сбою или неожиданному поведение, поэтому теперь, когда запущено несколько экземпляров игры, вам нужно закрыть все остальные экземпляры игры, прежде чем вы сможете снова запустить игру. По сути, удаление любого неожиданного поведения, которое это может вызвать.
  • Теперь менее заметная деталь, но если вы попытались запустить эту игру без минимально необходимых драйверов OpenGL, то появится окно с сообщением о том, что вы не можете запустить игру без них, самая ранняя поддерживаемая версия драйвера OpenGL - v2.8. В более поздних обновлениях это будет расширено, чтобы также проверить библиотеку SDL, а также минимальные системные требования.
  • Наконец, функция, которой я очень горжусь, на случай, если ваша игра вылетит или данные будут потеряны или изменены таким образом, что игра больше не сможет прочитать свой основной файл хранилища (в нем хранится все, начиная с даты, когда игра последний раз запускалась, до игра вылетела при последнем запуске и размер окна игры прежний), затем игра вылетает и пытается перезапуститься, если это, кроме того, не удается, появляется сообщение о том, что игра аварийно завершилась аварийно и что вы можете потерять все свои прогресс, то игра попытается сохранить ваши данные в более безопасном режиме, если это не удастся, игра сотрет файл и запустит вас снова, поэтому у вас не будет проблем, когда файлы будут повреждены в скомпилированном режиме, и вам придется полностью переустановить игру, теряя ценные сохраненные данные, которые еще могут быть сохранены.

Это все QuickBits для этой статьи, однако есть множество более мелких функций, которые содержит это обновление, которые не будут документированы, потому что они гораздо меньших функций (например, задержка перед появлением описания настроек для соответствующей настройки в графическом интерфейсе настроек имеет был доработан).

Лента новостей

В этом заключительном разделе, прежде чем мы закончим, я хотел бы поговорить о будущем. Pycraft — это долгосрочный проект, и потребуется некоторое время, прежде чем игра будет завершена, будет много обновлений и настроек для каждого из графических интерфейсов, а также новые основные функции. На данный момент проект выглядит следующим образом:

Пикрафт v0.8; Текущая версия Pycraft.

Пикрафт v0.9; Это версия, задокументированная в этой статье, дата выпуска для нее - примерно середина сентября, однако это, как и все обновления, которые я выпустил, не будет спешить и будет настолько свободным от ошибок, насколько я могу это сделать, а также максимальное качество, которое я могу получить.

Пикрафт v0.10; Это обновление планируется запустить в середине сентября, после завершения Pycraft v0.9. Это обновление будет включать в себя изменения в графическом интерфейсе основной игры с использованием Vertex Buffer Objects (VBO), более высокую производительность, лучшую интеграцию с погодой, больше звуков для ходьбы под дождем и снегом, звуки дождя, звуки погоды (например, ветер), улучшенный туман, более реалистичные (и рабочие) скайбоксы, дневной и ночной цикл, создание экземпляров и возможное введение травы, деревьев и кустов, океан и система столкновений (со звуками для ходьбы по траве, дорожкам и камню), дальнейшие обновления всей 3D-карты, как а также обновления инвентаря и графического интерфейса карты, это обновление, как мы надеемся, также будет включать в себя HUD (Heads-up display). Это большое обновление, поэтому для его завершения потребуется значительное время, слишком рано говорить, будут ли представлены все упомянутые функции в этом обновлении, а также указывать дату выпуска, однако id оценивает Рождество как лучший сценарий. здесь.

Пикрафт v0.11; Это очень далеко, но это обновление будет сосредоточено на обновлении настроек (например, задержка информации о том, что делает каждая настройка, с соответствующей информацией), а также меню настройки персонажа и достижений, которые впервые были разработаны и представлены в этом обновлении. , Пикрафт v0.9.

Что-то сверх этого еще слишком далеко, чтобы говорить, и обратите внимание, что некоторые из упомянутых функций не будут добавлены, если будет найден подходящий и чистый способ их реализации, однако я сделаю все возможное, чтобы реализовать как можно больше. из них, как я могу.

Заключительные слова

Да, вы сделали это, спасибо, что прочитали, это действительно ценно. Много времени и усилий уходит на создание этих обновлений и написание подобных статей, более 40 часов исследований, проектирования, прототипирования, дизайна и дизайна ресурсов, реализации, исправления ошибок и тонкой настройки, потраченных на каждую из изюминок этих функций. обновления, а также значительное количество времени за кулисами с меньшими QuickBits, которые нужно добавить к обновлению. В дополнение ко всему этому я постоянно обновляю страницу GitHub (которую можно найти здесь: PycraftDeveloper/Pycraft), а также держу всех в курсе в твиттере (@PycraftDev в твиттере: twitter.com/PycraftDev), под # PycraftTJ.

Наконец, я хотел бы поблагодарить вас всех за чтение, так много усилий вложено во все это, и это моя первая попытка написать подобную статью, поэтому, пожалуйста, поддержите меня, пока я учусь, и принимайте отзывы (которые были бы очень признательны) .

Ссылки и кредиты

Моя страница в Твиттере: twitter.com/PycraftDev

Моя страница на GitHub: github.com/PycraftDeveloper

Pycraft можно найти здесь: github.com/PycraftDeveloper/Pycraft

С благодарностью:

Pygame (www.pygame.org), Numpy (numpy.org), Pillow (PIL) (python-pillow.org), Python (www.python.org), Tkinter, PyAutoGUI (pyautogui.readthedocs.io /en/latest), psutil (psutil.readthedocs.io/en/latest), GitHub (github.com), PyOpenGL (PyOpenGL — Python OpenGL Binding (sourceforge.net)), OpenGL (www.opengl. org), YouTube, Windows, Visual Studio Code (code.visualstudio.com), Microsoft и мои замечательные подписчики и сообщество в Твиттере.

Обратите внимание, что ссылки под пометкой «С благодарностью» не модерируются мной, они являются безопасными ссылками на момент написания, однако я не контролирую их содержание.