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 ready(self): self.background = Image(u'../resources/image/main/result/background.png') self.gauge1 = Image(u'../resources/image/main/result/gauge1_full.png', x=60, y=160) self.gauge2 = Image(u'../resources/image/main/result/gauge2_full.png', x=60, y=160) self.retry = Button(u'../resources/image/main/result/retry.png', w=180, h=80, x=140, y=460) self.menu = Button(u'../resources/image/main/result/menu.png', w=180, h=80, x=480, y=460) self.minute = Number(0, u'../resources/image/main/result/time.png', x=420, y=306, w=60, h=75) self.second10 = Number(0, u'../resources/image/main/result/time.png', x=540, y=306, w=60, h=75) self.second1 = Number(0, u'../resources/image/main/result/time.png', x=600, y=306, w=60, h=75) self.sprites = OrderedUpdates(self.gauge2, self.gauge1, self.minute, self.second10, self.second1, self.retry, self.menu) self.retry.on_release = lambda : Game.get_scene_manager().change_scene('game',self.stage.bomb, self.stage.cpu) self.menu.on_release = lambda : Game.get_scene_manager().change_scene('title') for button in [self.retry, self.menu]: button.hover_sound = '../resources/sound/on_cursor.wav' button.press_sound = '../resources/sound/selected.wav' self.gauge1.xscale = float(self.navigation.gauge.proportion[0])/100 m, s = self.navigation.timer.convert_time() self.minute.n = m if s < 10: self.second10.n = 0 self.second1.n = s else: self.second10.n = int(str(s)[0]) self.second1.n = int(str(s)[1]) if self.stage.count[0] > self.stage.count[1]: self.sprites.add(Image(u'../resources/image/main/result/win.png', x=80, y=160)) self.sprites.add(Image(u'../resources/image/main/result/lose.png', x=480, y=160)) elif self.stage.count[0] < self.stage.count[1]: self.sprites.add(Image(u'../resources/image/main/result/win.png', x=480, y=160)) self.sprites.add(Image(u'../resources/image/main/result/lose.png', x=80, y=160)) else: self.sprites.add(Image(u'../resources/image/main/result/draw.png', x=280, y=170))
class Scene(object): key = u"AbstractScene" BACKGROUND = (0,0,255) def __init__(self): self.sprites = OrderedUpdates() def ready(self, *args, **kwargs): Game.get_screen().fill(self.BACKGROUND) def update(self, *args, **kwargs): self.sprites.update(*args, **kwargs) def draw(self, surface=Game.get_screen()): pygame.draw.rect(surface, self.BACKGROUND, (0, 0, settings.SCREENWIDTH, settings.SCREENHEIGHT)) update_rect = [] update_rect += self.sprites.draw(surface) return update_rect def finalize(self): self.sprites.empty()
class Scene(object): key = u"AbstractScene" BACKGROUND = (0,0,255) BACKGROUND_SURFACE = Image(u'../resources/image/main/background.png').image def __init__(self): self.sprites = OrderedUpdates() def ready(self, *args, **kwargs): Game.get_screen().fill(self.BACKGROUND) def update(self, *args, **kwargs): self.sprites.update(*args, **kwargs) def draw(self, surface=Game.get_screen()): update_rect = [] update_rect += self.sprites.draw(surface) return update_rect def finalize(self): self.sprites.empty()
class Scene(object): key = u"AbstractScene" BACKGROUND = (0, 0, 255) def __init__(self): self.sprites = OrderedUpdates() def ready(self, *args, **kwargs): Game.get_screen().fill(self.BACKGROUND) def update(self, *args, **kwargs): self.sprites.update(*args, **kwargs) def draw(self, surface=Game.get_screen()): pygame.draw.rect(surface, self.BACKGROUND, (0, 0, settings.SCREENWIDTH, settings.SCREENHEIGHT)) update_rect = [] update_rect += self.sprites.draw(surface) return update_rect def finalize(self): self.sprites.empty()
def __init__(self): self.sprites = OrderedUpdates()
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