def __init__(self, bomb=False, cpu=True): self.bomb = bomb self.cpu = cpu self.panels = OrderedUpdates() self._map = [] self.unitmng = UnitManager(self) self.unitmng.reset() for y in xrange(settings.STAGE_HEIGHT): column = [] for x in xrange(settings.STAGE_WIDTH): owner = 0 if y < settings.STAGE_HEIGHT/2: owner = 1 panel = Panel(x, y, owner) column.append(panel) self.panels.add(panel) self._map.append(column) self._map = map(list, zip(*self._map)) #transpose matrix if cpu: interfaces = ['mouse', 'key'] if JoyPad().get_count(): interfaces.append('pad') self.players = OrderedUpdates(Player(0, interfaces), NPC(1)) else: self.players = OrderedUpdates(Player(0), Player(1)) self.panelsets = [] #回転中のPanelSet self.count = [settings.STAGE_WIDTH*settings.STAGE_HEIGHT/2,settings.STAGE_WIDTH*settings.STAGE_HEIGHT/2] self.draw()
class Stage(Singleton): def __init__(self, bomb=False, cpu=True): self.bomb = bomb self.cpu = cpu self.panels = OrderedUpdates() self._map = [] self.unitmng = UnitManager(self) self.unitmng.reset() for y in xrange(settings.STAGE_HEIGHT): column = [] for x in xrange(settings.STAGE_WIDTH): owner = 0 if y < settings.STAGE_HEIGHT/2: owner = 1 panel = Panel(x, y, owner) column.append(panel) self.panels.add(panel) self._map.append(column) self._map = map(list, zip(*self._map)) #transpose matrix if cpu: interfaces = ['mouse', 'key'] if JoyPad().get_count(): interfaces.append('pad') self.players = OrderedUpdates(Player(0, interfaces), NPC(1)) else: self.players = OrderedUpdates(Player(0), Player(1)) self.panelsets = [] #回転中のPanelSet self.count = [settings.STAGE_WIDTH*settings.STAGE_HEIGHT/2,settings.STAGE_WIDTH*settings.STAGE_HEIGHT/2] self.draw() def update(self): for player in self.players: player.update() press = player.poll() if press: lp = player.point panels = (self.get_panel(lp),self.get_panel(lp+LocalPoint(1,0)),self.get_panel(lp+LocalPoint(1,1)),self.get_panel(lp+LocalPoint(0,1))) if self.can_rotation(panels, player.number): for p in panels: if p.unit: self.unitmng.remove(self.unitmng.get_unit_by_panel(p)) break self.panelsets.append(PanelSet(panels, press)) for i,ps in enumerate(self.panelsets): if ps.is_over(): self.rotate(ps.panels, ps.degree) panel = ps.panels[0] for panel in ps.panels: panel.rotation = False self.unitmng.check(panel) del self.panelsets[i] map(lambda panelset: panelset.update(),self.panelsets) for unit in self.unitmng.units: res = unit.update() if res == -1: self.unitmng.remove(unit) elif res: vector = unit.degree enemies = [] hit = False for panel in unit.panels: next = self.get_panel(panel.point+vector) if not next.can_through() and not unit.has(next): hit = True neighbor_unit = self.unitmng.get_unit_by_panel(next) if not next.is_dummy() and neighbor_unit and not neighbor_unit in enemies and not neighbor_unit.owner == unit.owner: enemies.append(neighbor_unit) if enemies: map(lambda enemy: self.unitmng.battle(unit, enemy), enemies) elif not hit: self.unitmng.move_unit(unit, vector) self.count = [0,0] for x in xrange(settings.STAGE_WIDTH): for y in xrange(settings.STAGE_HEIGHT): self.count[self._map[x][y].owner]+=1 self._map[x][y].update() Effect.effects.update() def draw(self): update_rect = [] # for x in xrange(settings.STAGE_WIDTH): # for y in xrange(settings.STAGE_HEIGHT): # self._map[x][y].draw() update_rect += self.panels.draw(Game.get_screen()) update_rect += self.unitmng.draw() update_rect += self.players.draw(Game.get_screen()) update_rect += Effect.effects.draw(Game.get_screen()) return update_rect def get_panel(self, lp): if 0 <= lp.x < settings.STAGE_WIDTH and 0<= lp.y < settings.STAGE_HEIGHT: return self._map[lp.x][lp.y] return DummyPanel(lp.x,lp.y) def swap(self, a, b): tmp = a.point self._map[a.point.x][a.point.y] = b self._map[b.point.x][b.point.y] = a a.point = b.point b.point = tmp def rotate(self, panels, degree): if degree == 1: self.swap(panels[0], panels[3]) self.swap(panels[3], panels[2]) self.swap(panels[2], panels[1]) else: self.swap(panels[0], panels[1]) self.swap(panels[1], panels[2]) self.swap(panels[2], panels[3]) for panel in panels: panel.angle = 0 def can_rotation(self, panels, player): owner = panels[0].owner if not owner is player: return False for panel in panels: if not panel.can_rotate(): return False if panel.owner != owner: return False return True def redraw_frame(self): u"""フレームを再描画する必要があるかどうか評価 端っこの座標で回転するPanelSetがあるかどうか """ for ps in self.panelsets: panel = ps.panels[0] if panel.point.x == 0 or panel.point.x == settings.STAGE_WIDTH-2 or panel.point.y == 0 or panel.point.y == settings.STAGE_HEIGHT-2: return True return False