class Navigation(Singleton): X = 675 Y = 20 def __init__(self, stage): self.image = pygame.surface.Surface((98,558)) self.image.set_colorkey((0,0,0)) self.background = Image(u'../resources/image/main/navigation/background.png') self.background.draw(self.image) self.contents = OrderedUpdates() self.timer = NavigationTimer(settings.TIME, x=46, y=82) self.stage = stage self.gauge = Gauge(x=10, y=5) self.update() self.draw() def update(self): self.timer.update() self.gauge.update(self.stage.count) def draw(self): if not self.timer.is_update and not self.gauge.is_update: return [] self.timer.draw(self.image) self.gauge.draw(self.image) rects = [Game.get_screen().blit(self.image, self.image.get_rect().move(self.X, self.Y))] return rects
class Timer(pygame.sprite.Sprite): COLON_HEIGHT = 4 HEIGHT = 40 WIDTH = 20 OFFSET = 10 u"""9分59秒〜0分00秒の間のみ""" def __init__(self, max, x=0, y=0): super(Timer, self).__init__() self.x = x self.y = y self.timer = _Timer(max*settings.FRAMERATE) self.gauge = Image(u'../resources/image/main/navigation/gauge_timer.png') self.gauge.center = Vector(0, self.gauge.rect.h) self.pre_second = 0 self.image = pygame.surface.Surface((70,396)).convert() self.image.set_colorkey((0,0,0)) self.is_update = True self._parse(self.convert_time()) def draw(self, surface=Game.get_screen()): return surface.blit(self.image, self.image.get_rect().move(self.x, self.y)) def _parse(self, time): minute = time[0] second = time[1] minute_surface = Number(minute, u'../resources/image/main/navigation/time.png').get_surface() timer_surface = pygame.surface.Surface((self.WIDTH,self.HEIGHT*3+self.COLON_HEIGHT+self.OFFSET*3)) timer_surface.blit(minute_surface, minute_surface.get_rect()) self.pre_second = second if second < 10: second10 = Number(0,u'../resources/image/main/navigation/time.png').get_surface() second1 = Number(second,u'../resources/image/main/navigation/time.png').get_surface() else: second10 = Number(int(second/10),u'../resources/image/main/navigation/time.png').get_surface() second1 = Number(second%10,u'../resources/image/main/navigation/time.png').get_surface() timer_surface.blit(second10, second10.get_rect().move(0, self.HEIGHT+self.COLON_HEIGHT+self.OFFSET*2)) timer_surface.blit(second1, second1.get_rect().move(0, self.HEIGHT*2+self.COLON_HEIGHT+self.OFFSET*3)) self.image.blit(Image(u'../resources/image/main/background.png').image, self.gauge.image.get_rect(), self.gauge.image.get_rect().move(self.x, self.y)) self.image.blit(timer_surface, timer_surface.get_rect().move(28,96)) max = int(self.timer.max/settings.FRAMERATE)-1 now = int(self.timer.now/settings.FRAMERATE) self.gauge.yscale = float(max-now)/float(max) self.gauge.draw(self.image) def update(self): self.is_update = False self.timer.tick() second = self.convert_time()[1] if not second == self.pre_second: self.is_update = True self._parse(self.convert_time()) def play(self): self.timer.play() def convert_time(self): n = (self.timer.max - self.timer.now)/settings.FRAMERATE return int(n/60), n%60 def is_over(self): return self.timer.is_over()
class Result(Singleton): def __init__(self, stage, navigation): self.navigation = navigation self.stage = stage 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)) def draw(self, surface=Game.get_screen()): self.background.draw() self.navigation.background.draw(self.navigation.image) self.sprites.draw(Game.get_screen()) def update(self): self.sprites.update()
class GameScene(Scene): def ready(self, *args, **kwargs): self.background = Image(u'../resources/image/main/background.png') self.frame = Image(u'../resources/image/main/frame.png', x=settings.STAGE_OFFSET[0]-15, y=settings.STAGE_OFFSET[1]-15) self.stage = Stage(args[0], args[1]) self.bgm = BGM(u'../resources/bgm/game_intro.wav', -1, u'../resources/bgm/game_loop.wav') self.background.draw() self.frame.draw() self.navigation = Navigation(self.stage) self.sequence_mng = SceneManager({'ready':ReadySequence(self.frame, self.background), 'main': MainSequence(self.stage, self.navigation), 'result':ResultSequence(self.stage, self.navigation, self.frame, self.bgm), 'pause':PauseSequence(self.navigation)}) def init(): if settings.DEBUG: return 'main' else: return 'ready' self.sequence_mng.change_scene(init()) self.redraw = False Effect.reset() self.draw() def update(self): super(GameScene, self).update() self.bgm.play() next = self.sequence_mng.current_scene.update() if next: self.redraw = True self.sequence_mng.change_scene(next) def draw(self): super(GameScene, self).draw() if self.redraw: self.redraw = False self.background.draw() self.frame.draw() if self.stage.redraw_frame(): self.frame.draw() #マップのはじで回転させたとき、回転の軌跡が残ってしまうため、フレームを再描画 rect_draw = self.stage.draw() rect_draw += self.navigation.draw() rect_draw += self.sequence_mng.current_scene.draw() return rect_draw