Примечания:
- Данная версия пока что рассчитана на разработку 2D игр (небольшая 3D поддержка есть, но большинство инструментов не реализовано) и работу только на Windows.
- В качестве API для отрисовки используется OpenGL (от 3.1 версии включительно)
- Документация по API ядра отсутствует, но исходный код ядра хорошо прокомментирован и изучить что либо можно прямо там.
- МОБИЛЬНЫЕ УСТРОЙСТВА В ЭТОЙ ВЕРСИИ НЕ ПОДДЕРЖИВАЮТСЯ!
Не пытайтесь заставить работать фреймворк на UNIX-системах. Для этого надо создать отдельную версию фреймворка или его расширение.
Основные проблемы с работой на других операционных системах (на данный момент):
- Не работает система сборки.
- Не работает система установки библиотек.
- Не работает код для запуска проекта.
- Не работает поддержка аудио в ядре.
- Некорректно работает поддержка работы с файлами в ядре.
- Не скомпилированы компилируемые скрипты Cython для Linux/MacOS.
- (Возможно есть и другие проблемы о которых я пока что не знаю).
Для начала работы с фреймворком, ознакомьтесь с туториалом на сайте PyGDF (Get-Started) (выберите эту версию фреймворка).
На этом же сайте есть страница с туториалами по разработки игр (возможно, пока что эта страница ещё не существует).
Если нашли баг, напишите мне в Telegram и обязательно укажите тег "@pygdf_bug" в начале сообщения.
Список изменений:
-
Минимальная версия OpenGL для работы GDF-Core, теперь
OpenGL 3.1. Если вы попробуете запустить окно на версии ниже, оно не будет создано и будет вызвано исключение о том, что ваша версия OpenGL не подходит. -
Обновлен список требуемых версий определённых библиотек. Требования обновлены до последних версий библиотек.
-
Теперь вы можете передать в класс
FontFile()не просто путь до файла шрифта, а io.BytesIO данные и всё будет работать. -
В функции окна
.set_config()теперь в параметры можно передать None чтобы ничего не устанавливать. Тогда функция будет использовать текущие настройки окна. -
В классе
Animator2D()добавлена новая функция.get_active(), которая возвращает текущее состояние анимации. А именно, проигрывается она или нет. -
Класс
SimpleParticleEffect2D()переименован вParticleEffect2D()по причине расширения функционала. Слово Simple в названии класса больше не уместно. -
В класс
ParticleEffect2D()добавлено 2 новых параметра:size_exp: float = 1.0иangle_exp: float = 1.0. Это экспонентционные параметры отвечающие за изменение размера и поворота частицы. Позволяет экспоненциально менять это поведение смещая скорость работы относительно времени жизни частицы. -
В классе
ParticleEffect2D()было изменено несколько параметров:start_size,end_size,start_angleиend_angle. Теперь можно указать начальный и конечный размер частицы случайным, и его поворот. Для размера, надо передать список из двух векторов между которыми случайным образом будет выбран размер частицы. А для случайного поворота, надо передать вектор из двух чисел, между которыми случайным образом будет высчитан начальный и конечный угол. Я также оставил вариант, где можно не передавать список из двух векторов и векторов для случайного определения поворота частицы. То есть всё ещё можно передать начальный и конечный размер в виде обычного вектора, и начальный и конечный поворот в видеfloatзначения. -
В классе
Light2D.LightLayer()теперь используется шейдер для отрисовки света, а не режим смешивания OpenGL как раньше. -
В класс
Light2D.LightLayer()добавлено 2 новых параметра:intensityиmix_level. Первый параметр отвечает за повышение или понижение силы яркости всего света (кроме окружающегоambient), а второй параметр отвечает за смешивание текстуры окружающего света и текстуры освещения. При смешивании этих текстур, получается эффект "дымки" или тумана. -
В классе генератора текста из шрифта
FontGenerator()теперь не обязательно в цвете указывать альфа канал. Если его не указать, автоматически будет использоваться альфа цвет равный1.0 -
Улучшена работа с 3D текстурами, и исправлена неточность в работе класса 2D текстуры. Добавлены дополнительные тонкие настройки текстуры.
-
В классе
Sound()теперь при установке позиции и скорости можно передавать не толькоvec3, но иvec2. -
Класс
Sound()был переделан. Принцип его работы изменён. Теперь вы можете загружать неограниченное количество звуков в игру (до этого было ограничение в 256 штук), путём использования буфера а не источника звука. Теперь можно воспроизводить звук повторно не останавливая прошлое воспроизведение (то есть теперь можно задать наложение звуков, а не его проигрывание с начала). Это реализовано благодаря стеку звуков. -
Класс
Listener()был переименован вSoundListener()для большей интуитивности. -
Теперь в
SoundListener()при установке позиции, можно передавать не толькоvec3, но иvec2. -
Содержание некоторых функций из
Physics2Dбыло перенесено и реализовано на Cython, тем самым немного ускорив вычисления. -
Классы
FindedObject()иContactPoint()вPhysics2D, теперь выводят значения своих параметров, когда вы хотите отобразить их черезprint() -
В классе
Space()вPhysics2Dбыли перенесены встроенные функции-обработчики столкновений на Cython, ускорив тем самым вычисления. -
Содержание нескольких функций из класса
Space()вPhysics2D, а именно:.object_query(),.find_near_object()и.find_objects()были перенесены на Cython, тем самым немного ускорив вычисления. -
Пакетная отрисовка спрайтов больше не имеет параметра
camera: Camera2Dв конструкторе и в целом. И возможности отсекать спрайты, которые находятся за её полем зрения. Сделано это потому что это не имеет смысла, ибо слишком большая нагрузка на вычисление проверки пересечения. (Возможно, в будущем я верну это и сделаю вычисление пересечения быстрее). -
Подкорректирован модуль
files. В некоторых функциях добавлены уточнения с работойio.BytesIO -
Изменён класс
Music(). Работа с классом теперь схожа с классомSound(). Теперь при создании класса и в функции.load()можно передать путь до музыкального файла или уже загруженное содержимое. Теперь можно управлять наложением музыки при вызове функции.play(loop: bool = False, overlay: bool = True)также как и вSound()классе. -
Изменён класс
Image(). Теперь при создании класса или загрузке изображения через.load()можно указать не только путь до файла, но и уже загруженные или созданные данные изображения, по типуio.BytesIO() -
Изменён класс
FontFile(). Теперь можно корректно передавать либо путь до файла шрифта, либо уже загруженные данные шрифта в форматеio.BytesIOили другом байтовом формате данных, как при создании экземпляра класса, так и передавать в функцию.load() -
Теперь в классе окна
Window()есть 3 способа закрытия окна..exit()- Закрывает окно, вызывает функции уничтожения у текстур, звуков, сцен и тд, сразу останавливает выполнение кода..close()- Закрывает окно только после выполнения функций.update()и.render(), так же вызывает функции уничтожения у ресурсов, но код не останавливает. Он продолжает исполняться с места где была вызвана инициализация окна..quit()- Закрывает видеосистему PyGame. Равносильно вызовуpygame.quit(). Не удаляет ресурсы и не останавливает код.
-
Изменён кадровый буфер
FrameBuffer(). Теперь там есть функция.resize(width: int, height: int)для изменения размера кадрового буфера. Теперь не надо пересоздавать текстуру. Мы просто её перезаписываем. -
Изменён класс
Renderer2D(). Теперь в функции.resize()мы не пересоздаём текстуру каждый раз, а используем функцию.resize()из кадрового буфера. -
Правки с вызовами
gl.glEnable/Disable(gl.GL_TEXTURE_2D). Были убраны лишние вызовы. -
Переход класса
ImGUI()сpyimgui[pygame]наimgui_bundle. Благодаря своему классу рендеринга на основеPygameRenderer()(изpyimgui) иSDL2Renderer()(изimgui_bundle) удалось заставить работатьimgui_bundleна pygame в связке с pyopengl. Другими словами, интерфейс теперь более новый с дополнительными возможностями. Из минусов: Немного другой API. Придётся учиться писать интерфейс под новый API. Уimgui_bundleдокументации как таковой нет, и учиться придётся на примерах. -
В класс
ImGUI()добавлена новая функция.set_font(file_path: str, font_size: int = 14, smooth: bool = False)для установки шрифта интерфейса. Если передать путь до шрифта, установится ваш шрифт. Если передать вместо пути тип данныхNone, то шрифт сбросится на шрифт по умолчанию. -
Прочие мелкие изменения кода.
Список исправления ошибок:
-
В классе
ParticleEffect2D()была исправлена проблема с использованием параметров. До этого, параметры были независимы от размерности пространства (единицы измерения относительно пикселя). Система частиц всегда работала как в единичной системе координат, так и в пиксельной системе координат одинаково. Теперь, когда вы используете пиксельную систему координат (1 метр = 100 пикселей), вам также надо подстраивать ваш эффект частиц увеличивая значения параметров. -
В классе
Utils2D()в функции.get_angle_points()исправлена проблема связанная со смещением угла на 90 градусов. GDF использует систему вращения по часовой стрелке, начиная сверху а не справа и против часовой стрелки как это происходит в других библиотеках и программах. -
В классе
Sprite2D()исправлена проблема связанная с тем, что когда пытаешься отрисовать спрайт размером с 0 пикселей, он остаётся быть размером в минимум 1 пиксель. -
Исправлена проблема в классе окна, при которой дельта времени учитывала задержку в переключении сцен. Теперь дельта времени не регистрирует задержку между переключениями сцен (при переключении сцены, дельта времени обнуляется, а если дельта времени равна нулю, то используется дельта времени прошлого кадра).
-
Исправлен баг с загрузкой шрифта через
FontFile()вFontGenerator(). Баг был связан с тем, чтоio.BytesIO()закрывался в тот момент какpygame.font.Font()пытался загрузить данные шрифта. -
Теперь, если вы попробуете создать физическое тело в
Physics2DизPhysics2D.Objectsс нулевой, или отрицательной массой, масса будет установлена в значение ноль, а физический тип объекта станетKINEMATIC. До этого, тело с массой равной нулю или меньше, просто исчезало или ломало физический движок. -
В классе
Mesh()вPhysics2D.Objects, была исправлена ошибка, где предполагалось получение вершин тела в мировых координатах, но фактически получали те вершины, которые были переданы при создании тела. А также некоторый код был перенесён на Cython, чтобы ускорить вычисления вершин и генерацию физических форм. -
В классе
Sound()после внедрения стека звуков, были выявлены и исправлены баги с тем, что при работе со звуком, действия принимались только к последнему звуку в стеке, а не ко всем звукам. -
В классе
Music()были выявлены потенциальные проблемы в случае если попытаться управлять или использовать музыку до того, как она будет создана и готова к использованию. -
Прочие мелкие корректировки кода.
Список найденных проблем:
-
Вы не можете передать
io.BytesIOвSound()иSound().load(), потому что PyOpenAL принимает для загрузки файла только путь до него. По этому вам придётся в любом случае работать с файлом звука. -
Вы не можете удалить буфер звука PyOpenAL. По неизвестной причине вылетает ошибка о неправильной операции. Проблема скорее всего не связана с привязкой удаляемого буфера к источникам звука.
-
Вы можете воспроизводить до 256 звуков одновременно в целом (ограничение OpenAL в доступной памяти).
К этому релизу приложены 2 файла:
-
PyGDF-Framework-v1.2-release.zip- Это шаблонный проект для разработки игр и программ.
Просто разархивируйте и получите папку с уже готовой начинкой проекта и модулемgdfс исходным кодом ядра. -
gdf-1.2-cp311-cp311-win_amd64.whl- Это библиотека pip которую можно установить у себя на пк.
Благодаря ей, можно не использовать ядро с его исходным кодом у себя в проекте.
Установить эту библиотеку можно консольной командой (убедитесь что консоль открыта в той же директории, где и находится этот файл!):
pip install gdf-1.2-cp311-cp311-win_amd64.whl
Импортировать в коде можно будет как обычную библиотеку:import gdf/from gdf import *