トークン管理クラス
たぶんPython以外では実装が難しいですが、
トークン(ゲームオブジェクト)管理クラスの実装について。
クラス図
AbstractFactoryっぽい設計です。
ソースコード
#!/usr/bin/env python # -*- coding: utf-8 -*- class IToken: """ トークン基底クラス """ g = None # 描画デバイス i = None # 入力デバイス m = None # サウンドデバイス class ITokenManager: """ トークン管理クラス """ @classmethod def init(cls): """ リスト初期化 """ cls.List = [] @classmethod def append(cls, token): """ トークンの追加 """ cls.List.append(token) @classmethod def remove(cls, token): """ トークンの削除 """ cls.List.remove(token) @classmethod def removeAll(cls): """ トークンをすべて削除 """ del cls.List cls.init() @classmethod def getList(cls): """ リストのコピー取得 """ return cls.List[:] @classmethod def size(cls): """ リストのサイズ取得 """ return len(cls.List) class Enemy(IToken): """ 敵クラス """ def __init__(self, id, x, dx): self.id = id # 敵の種類 self.x = x # X座標 self.dx = dx # X移動量 self.exist = True # 生存フラグ def update(self): """ 更新 """ self.x += self.dx # 移動量更新とか if self.x >= 10: self.exist = False # ゴールに到達 def draw(self): """ 描画 """ print "Enemy[%d] (x,dx)=(%d,%d)"%(self.id, self.x, self.dx) class EnemyManager(ITokenManager): """ 敵管理クラス """ @classmethod def createEnemy(cls, id, x, dx): """ 敵の生成 """ enemy = Enemy(id, x, dx) cls.append(enemy) def main(): # 1次元移動ゲーム? EnemyManager.init() EnemyManager.createEnemy(0, 0, 2) EnemyManager.createEnemy(1, 3, 1) for i in range(8): print u"ゲームループ:%d回目"%i # 更新してー for enemy in EnemyManager.getList(): enemy.update() if not enemy.exist: # 敵消滅。爆発エフェクトなんかを生成してやりましょう。 # たとえば、 # >>>for i in range(5): # >>> EffectManager.createEffect(0, enemy.x, random.randint(-2, 2)) # とか。 EnemyManager.remove(enemy) # 描画ー for enemy in EnemyManager.getList(): enemy.draw() if __name__ == "__main__": main()
クラスメソッドという機能を使っています。
これを使うと、
クラスのスタティックメソッドのように、
どこからでもアクセスできるのがメリットです。
@classmethod
というのがPython2.4で追加されたもので、
それに続くメソッドをクラスメソッドにする命令です。
ただ、Python2.3とかで実装する場合は、「@classmethod」は使えないので、
class Obj: def method(cls): pass method = classmethod(method)
などとする必要があります。
あと、ITokenの派生クラスでは、デバイスオブジェクトをスタティックに共有していたりします。
(この例では使ってませんがー
実行結果はこんな感じです。
ゲームループ:0回目 Enemy[0] (x,dx)=(2,2) Enemy[1] (x,dx)=(4,1) ゲームループ:1回目 Enemy[0] (x,dx)=(4,2) Enemy[1] (x,dx)=(5,1) ゲームループ:2回目 Enemy[0] (x,dx)=(6,2) Enemy[1] (x,dx)=(6,1) ゲームループ:3回目 Enemy[0] (x,dx)=(8,2) Enemy[1] (x,dx)=(7,1) ゲームループ:4回目 Enemy[1] (x,dx)=(8,1) ゲームループ:5回目 Enemy[1] (x,dx)=(9,1) ゲームループ:6回目 ゲームループ:7回目