Skip to content

PyGDF v1.2-release (stable)

Latest

Choose a tag to compare

@LukovDev LukovDev released this 04 Jan 15:09
503047c

Примечания:

  • Данная версия пока что рассчитана на разработку 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 *

Ссылки:

VK
Telegram
PyGDF
PyGDF-Get-Started