В очередной раз зачесались руки поближе познакомиться с гейм-девом. Открыл сайт pygame и увидел новость про то, что PySDL 0.9.3 released. Стало любопытно, что за зверь такой.
Поискав в интернете, не нашел никаких статей на русском, на английском тоже как-то не особо много. В общем, кроме как читать документацию, ничего не остается.
К сожалению, мой английский достаточно слабый, поэтому, если я что-то не так понял из документации - поправьте.
PySDL2 - обертка над библиотекой SDL2. В отличии от PySDL - не имеет лицензионных ограничений.
Итак, установка. Конечно же у вас в системе должена быть библиотека SDL. Лично я сам пакет поставил system wide, но я думаю, что можно поставить и в virtual env.
$ sudo pip install PySDL2
Ну и как всегда, pip не подвел! Отлично установил пакет в систему, можем пользоваться.
А вот как пользоваться - вопрос другой. Как я уже говорил, на просторах интернета не много информации, хотя документация вроде не плохая. Только вот английский знать надо.
Думаю резонно сначала прогнать те самые два туториала, которые есть в доках. Мало ли кому русскоязычному пригодится.
Итак, открываем любимый редактор, создаем новый файл и поехали.
# -*- coding: utf-8 -*- import sdl2.ext sdl2.ext.init() window = sdl2.ext.Window('Hello, world!', size=(640, 480)) window.show() processor = sdl2.ext.TestEventProcessor() processor.run(window) sdl2.ext.quit()
И попробуем запустить.
$ python main.py
И перед нами появляется окно. В нём правда осталось то, что было у вас на экране до этого, но это уже полноценное окно, которое отреагирует, если его попробовать закрыть.
Давайте теперь попробуем разобраться, что тут у нас происходит.
import sdl2.ext
Тут должно быть понятно. Импортируем свежепоставленный пакет
sdl2.ext.init()
Инициализируем SDL. Если кто-то пробовал pygame, то вспомнит:
pygame.init()
Вот это и есть тоже самое. Идем дальше:
window = sdl2.ext.Window('Hello, world!', size=(640, 480)) window.show()
В общем и целом должно быть понятно и по коду. Создаем окно SDL размером 640х480 пикселей и заголовком 'Hello, world!' и затем показываем его.
В отличие от pygame, PySDL2 имеет объектно-ориентированное API, чего мне очень не хватало в pygame. Хотя это было и не критично, это не единственная крутая фича. Но об этом позже.
Разберем две последние строки:
processor = sdl2.ext.TestEventProcessor() processor.run(window)
Вот тут пока не ясная магия. Однако ничего сверхъествественного тут нет. Просто разработчики PySDL2 заботливо положили в свой пакет класс, который обробатывает всего один ивент: SDL_QUIT. Т.е. если бы мы написали:
running = True while running: events = sdl2.ext.get_events() for event in events: if event.type == sdl2.SDL_QUIT: running = False break window.refresh()
то получили бы аналогичный эффект.
Ну и в конце выполнения приложения нужно отчистить видеопамять [1], которую мы инициализировали в начале.
sdl2.ext.quit()
Только вот незадача. Мы так и не вывели на экран 'Hello, world!' (заголовк не в счёт!). Туториал предлагает сделать это с помощью спрайта. Ну ладно, давайте попробуем! Определим переменную RESOURCES
# <...> import sdl2.ext RESOURCES = sdl2.ext.Resources(__file__, 'resources') sdl2.ext.init() # <...>
Эта переменная будет отличным помощником в загрузке игровых ресурсов. Так же рядом с файлом main.py нужно создать папку resources
Теперь нам нужно создать фабрику спрайтов:
# <...> window.show() sprite_factory = sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE) # <...>
загрузить спрайт в память:
hello_sprite = sprite_factory.from_image(RESOURCES.get_path('hello.png'))
и заставить его рисоваться:
sprite_renderer = sprite_factory.create_sprite_render_system(window) sprite_renderer.render(hello_sprite)
Магия... Попробуем разобраться с этим, но уже в следующей статье.
Полный код
# -*- coding: utf-8 -*- import sdl2.ext RESOURCES = sdl2.ext.Resources(__file__, 'resources') sdl2.ext.init() window = sdl2.ext.Window('Hello, world!', size=(640, 480)) window.show() sprite_factory = sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE) hello_sprite = sprite_factory.from_image(RESOURCES.get_path('hello.png')) sprite_renderer = sprite_factory.create_sprite_render_system(window) sprite_renderer.render(hello_sprite) processor = sdl2.ext.TestEventProcessor() processor.run(window) sdl2.ext.quit()
Сноски
[1] | Не знаю, как более правильно перевести video internals |