Пробуем PySDL2 часть 1

24.07.2014 22:10 | категории: python, PySDL2, гейм-дев, pygame

В очередной раз зачесались руки поближе познакомиться с гейм-девом. Открыл сайт 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
comments powered by Disqus