Mediatorを使った衝突判定処理の分離
とりあえず、Pythonのソースコードだけ。
解説は後日にて…。
class Task: """ タスク """ def __init__(self, name, x=0, dx=0): """ コンストラクタ """ self.name = name self.x = x self.dx = dx def update(self): """ 更新 """ self.x += self.dx if(self.x < 0 or 10 < self.x): return False return True def getName(self): return self.name def __str__(self): """ 文字列表現を取得 """ return "%s=%d"%(self.name, self.x) class TaskManager: """ タスク管理 """ def __init__(self, id, mediator): """ コンストラクタ """ self.id = id self.taskList = [] self.mediator = mediator def update(self): """ 更新 """ for task in self.taskList[:]: if task.update(): print task else: self.remove(task) # 通知 self.mediator.notify(self) def create(self, name, x, dx): """ タスクの生成 """ task = Task(name, x, dx) self.taskList.append(task) def remove(self, task): """ タスクの削除 """ self.taskList.remove(task) def getTaskList(self): return self.taskList[:] def size(self): return len(self.taskList) def getId(self): return self.id class TaskMediator: """ タスク通信管理 """ def __init__(self): """ コンストラクタ """ self.managerDist = {} def registTaskManager(self, mgr): """ タスクマネージャの登録 """ self.managerDist[mgr.getId()] = mgr def getTaskManager(self, id): """ タスクマネージャの取得 """ return self.managerDist[id] def notify(self, mgr): """ タスクマネージャ更新の通知 衝突判定を行う """ if mgr.getId() == 0: # プレイヤー(id:0) vs 敵(id:1) for player in mgr.getTaskList(): # 敵 enemyMgr = self.getTaskManager(1) for enemy in enemyMgr.getTaskList(): if self.isCollide(player, enemy): # 衝突 print "%s and %s collided."%(player.getName(), enemy.getName()) mgr.remove(player) enemyMgr.remove(enemy) else: # mgr.getId() == 1 # 敵(id:1) vs プレイヤー(id:0) for enemy in mgr.getTaskList(): # プレイヤー playerMgr = self.getTaskManager(0) for player in playerMgr.getTaskList(): if self.isCollide(enemy, player): # 衝突 print "%s and %s collided."%(enemy.getName(), player.getName()) mgr.remove(enemy) playerMgr.remove(player) def isCollide(self, task1, task2): """ 当たり判定 """ return task1.x == task2.x def main(): # メディエター生成 mediator = TaskMediator() # タスク管理生成 players = TaskManager(0, mediator) enemys = TaskManager(1, mediator) # メディエターに登録 mediator.registTaskManager(players) mediator.registTaskManager(enemys) # タスク生成 players.create("hoge", 0, 2) players.create("piyo", 3, 1) enemys.create("saba", 10, -2) enemys.create("iwasi", 5, -1) # 実行 i = 0 while True: print "%d---------------"%i players.update() enemys.update() if players.size() == 0 and enemys.size() == 0: print "end-------------" break i += 1 if __name__ == "__main__": main()