コンテンツへスキップ

STG その3

ゲーム用のタスク管理って昔から色々あるけど、あんまりごちゃごちゃしたのはやなので、nフレーム目に登録したタスクを返すだけのしくみをまず用意してます。

[cc lang=”python”]
class Task(object):
def __init__(self, frame = 0):
self.task = []
self.frame = frame

def __iter__(self):
self.task = [i for i in self.task if i[3] >= self.frame] # 期限切れを削除
for i in self.task:
dt = self.frame – i[2]
if dt >= 0:
yield (i[0], i[1], dt)
self.frame += 1

def add(self, name, args, st = 0, et = 0):
“””タスク名、中身、開始フレーム、終了”””
self.task.append((name, args, self.frame + st, self.frame + st + et))

def clear(self):
self.task = []
[/cc]

実際はもうちょっと追加や削除周りが色々あるんですけど、まあこんな感じ。見ての通りイテレータになってるので

[cc lang=”python”]
self.task = Task()
self.task.add(‘state’, ‘dead’, 10)
[/cc]

などとしておいて、フレームごとにループで回してやれば指定したフレームで返してくる寸法です。それを例えばこんな感じで処理してます。

[cc lang=”python”]
for i in self.task:
if i[0] == ‘state’:
self.state = i[1]
elif i[0] == ‘event’:
event.append(i[1])
[/cc]

フレーム可変だと別途時間を管理してやらないと駄目ですが、まあ、こんだけあれば十分かと。あとはオブジェクトの状態を管理するステートマシンと組み合わせれば敵やら弾やらが完成するわけで。
ゲームって例外的な要素の塊なので、基本部分はなるべくシンプルにしてあとからその都度追加できるようにする方が楽だと思うんですよね。実装しながら設計するみたいな。pythonだとそれができるので楽でいいなあ、と思ったりも。