やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

PySDL2におけるWorld

将来的にさまざまなイベントキャッチできるであろう。

成果物

GitHubPySDL2.World.201711031440

開発環境

最小ソースコード

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.Entity
    • sdl2.ext.SpriteFactory
      • Sprite?

APIリファレンス

以下、APIリファレンスを探してみた。オブジェクト関係図があった。

上記の章オブジェクト指向的に実装するためのクラスと思われる。この辺の仕組みが分かれば大まかな実装方法が見えてきそう。

モジュール概要

これまでのコードは主にsdl2.extモジュールを使っていることに気づいた。APIリファレンスを見ると、各モジュールの内容は以下のような内容である。

モジュール 概要
sdl2 C言語的要素(定数、関数API
sdl2.ext 基本要素(init()など)

所感

オブジェクト指向っぽさが見えてきたが、オブジェクト間の関係が把握できていない。そもそも、どんなオブジェクトがあるのかも知らない。Worldってなんだよ……どこ見れば概要がわかるんだよ……。と、さまよった。