PySDL2におけるWorld
将来的にさまざまなイベントキャッチできるであろう。
成果物
開発環境
- Linux Mint 17.3 MATE 32bit
- SDL2 2.0.2
- pyenv 1.0.10
最小ソースコード
import sys import sdl2 import sdl2.ext WHITE = sdl2.ext.Color(255, 255, 255) class SoftwareRenderer(sdl2.ext.SoftwareSpriteRenderSystem): def __init__(self, window): super(SoftwareRenderer, self).__init__(window) def render(self, components): sdl2.ext.fill(self.surface, sdl2.ext.Color(0, 0, 0)) super(SoftwareRenderer, self).render(components) class Player(sdl2.ext.Entity): def __init__(self, world, sprite, posx=0, posy=0): self.sprite = sprite self.sprite.position = posx, posy def run(): sdl2.ext.init() window = sdl2.ext.Window("こんにちは sdl2.ext.World() !!", size=(800, 600)) window.show() world = sdl2.ext.World() spriterenderer = SoftwareRenderer(window) world.add_system(spriterenderer) factory = sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE) sp_paddle1 = factory.from_color(WHITE, size=(20, 100)) sp_paddle2 = factory.from_color(WHITE, size=(20, 100)) player1 = Player(world, sp_paddle1, 0, 250) player2 = Player(world, sp_paddle2, 780, 250) running = True while running: events = sdl2.ext.get_events() for event in events: if event.type == sdl2.SDL_QUIT: running = False break world.process() if __name__ == "__main__": sys.exit(run())
参考
コード分析
いきなり難しくなった。以下に要素を洗い出してみた。
- sdl2.ext.World
- sdl2.ext.SoftwareSpriteRenderSystem
- sdl2.ext.Window
- sdl2.ext.SoftwareSpriteRenderSystem
- sdl2.ext.Entity
- sdl2.ext.SpriteFactory
- Sprite?
- sdl2.ext.SpriteFactory
APIリファレンス
以下、APIリファレンスを探してみた。オブジェクト関係図があった。
上記の章はオブジェクト指向的に実装するためのクラスと思われる。この辺の仕組みが分かれば大まかな実装方法が見えてきそう。
モジュール概要
これまでのコードは主にsdl2.ext
モジュールを使っていることに気づいた。APIリファレンスを見ると、各モジュールの内容は以下のような内容である。
モジュール | 概要 |
---|---|
sdl2 |
C言語的要素(定数、関数API) |
sdl2.ext |
基本要素(init()など) |
所感
オブジェクト指向っぽさが見えてきたが、オブジェクト間の関係が把握できていない。そもそも、どんなオブジェクトがあるのかも知らない。Worldってなんだよ……どこ見れば概要がわかるんだよ……。と、さまよった。