def ready(self, *args, **kwargs): super(MainMenuScene, self).ready() self.joypads = JoyPad().sticks self.logo = Image(os.path.join(self.IMAGE_PATH, "kawaz.png"), alpha=False) self.config = Image(os.path.join(self.IMAGE_PATH, "config.png"), alpha=False) self.exit = Image(os.path.join(self.IMAGE_PATH, "exit.png"), alpha=False) self.cursor = Image(os.path.join(self.IMAGE_PATH, "cursor.png"), alpha=True) self.load_player_selection(len(self.joypads)) self.logo.x = 353; self.logo.y = 260 self.player2.x = 160; self.player2.y = 400 self.player3.x = 380; self.player3.y = 400 self.player4.x = 600; self.player4.y = 400 self.config.x = 380; self.config.y = 460 self.exit.x = 600; self.exit.y = 460 # カーソル位置を初期化 self.menu_options = ((self.player2, self.player3, self.player4), (None, self.config, self.exit)) self.menu_actions = ( (lambda:self.start_game(2), # self.player2 lambda:self.start_game(3), # self.player3 lambda:self.start_game(4),)# self.player4 , (lambda:0, # None lambda:Game.get_scene_manager().change_scene('keysetting'), #self.config lambda:sys.exit()) # self.exit ) self.cursor_logical_x = 0; self.cursor_logical_y = 0; self.set_cursor_pos(0, 0) self.sprites.add(self.logo) self.sprites.add(self.player2) self.sprites.add(self.player3) self.sprites.add(self.player4) self.sprites.add(self.config) self.sprites.add(self.exit) self.sprites.add(self.cursor) self.keysupp = KeySuppressor(self.KEY_REPEAT_TIME)
class MainMenuScene(Scene): BACKGROUND = (255,255,255) CURSOR_BORDER = 10 # カーソルを表す画像が、選択肢を表す画像からどれだけずらして配置されるか IMAGE_PATH = "../resources/image/menu" KEY_REPEAT_TIME = 0.2 # 何秒以内の間なら、キーが押され続けていても連打とみなさないか # 2Players, 3Players, 4Playersの画像を読み込む def load_player_selection(self, joypad_number): fail = ("" if joypad_number >= 2 else "x") self.player2 = Image(os.path.join(self.IMAGE_PATH, "player2%s.png" % fail), alpha=False) fail = ("" if joypad_number >= 3 else "x") self.player3 = Image(os.path.join(self.IMAGE_PATH, "player3%s.png" % fail), alpha=False) fail = ("" if joypad_number >= 4 else "x") self.player4 = Image(os.path.join(self.IMAGE_PATH, "player4%s.png" % fail), alpha=False) # カーソルをx方向にdir_x、y方向にdir_yだけ動かす def set_cursor_pos(self, dir_x, dir_y): target_option = False sys.stderr.write("(%d,%d)" % (self.cursor_logical_x, self.cursor_logical_y)) while not target_option: # y方向 self.cursor_logical_y = (self.cursor_logical_y + dir_y) % len(self.menu_options) # x方向 self.cursor_logical_x = (self.cursor_logical_x + dir_x) % len(self.menu_options[self.cursor_logical_y]) sys.stderr.write("->(%d,%d)" % (self.cursor_logical_x, self.cursor_logical_y)) # 描画位置の計算 target_option = self.menu_options[self.cursor_logical_y][self.cursor_logical_x] # ここで、指定した位置に選択肢がなかった場合、 # もう一度カーソルの移動を適用する。例えば # [Option1] [Option2] [Option3] # [Option4] [Option6] # という並びで、[Option4]にカーソルがある状態で右キーを # 押したとする。このとき、カーソルは一度[Option4]と[Option6]の # 間に行こうとするが、それが無効と判断され、もう一度 # カーソルが右に動く(結果、[Option6]でカーソルが止まる)。 sys.stderr.write("\n") # 指定した位置に選択肢があった場合に、はじめてwhileループを抜ける。 # ここでカーソルの描画位置を計算。 self.cursor.x = target_option.x - self.CURSOR_BORDER self.cursor.y = target_option.y - self.CURSOR_BORDER # ゲームを始める def start_game(self, player_number): # TODO: ここに、ゲーム画面へ移動するコードを書く pass def ready(self, *args, **kwargs): super(MainMenuScene, self).ready() self.joypads = JoyPad().sticks self.logo = Image(os.path.join(self.IMAGE_PATH, "kawaz.png"), alpha=False) self.config = Image(os.path.join(self.IMAGE_PATH, "config.png"), alpha=False) self.exit = Image(os.path.join(self.IMAGE_PATH, "exit.png"), alpha=False) self.cursor = Image(os.path.join(self.IMAGE_PATH, "cursor.png"), alpha=True) self.load_player_selection(len(self.joypads)) self.logo.x = 353; self.logo.y = 260 self.player2.x = 160; self.player2.y = 400 self.player3.x = 380; self.player3.y = 400 self.player4.x = 600; self.player4.y = 400 self.config.x = 380; self.config.y = 460 self.exit.x = 600; self.exit.y = 460 # カーソル位置を初期化 self.menu_options = ((self.player2, self.player3, self.player4), (None, self.config, self.exit)) self.menu_actions = ( (lambda:self.start_game(2), # self.player2 lambda:self.start_game(3), # self.player3 lambda:self.start_game(4),)# self.player4 , (lambda:0, # None lambda:Game.get_scene_manager().change_scene('keysetting'), #self.config lambda:sys.exit()) # self.exit ) self.cursor_logical_x = 0; self.cursor_logical_y = 0; self.set_cursor_pos(0, 0) self.sprites.add(self.logo) self.sprites.add(self.player2) self.sprites.add(self.player3) self.sprites.add(self.player4) self.sprites.add(self.config) self.sprites.add(self.exit) self.sprites.add(self.cursor) self.keysupp = KeySuppressor(self.KEY_REPEAT_TIME) def update(self): # Joypadによるカーソル操作 # 各Joypadについて動きをチェックする for joypad_id in range(len(self.joypads)): # 直近のキー操作から xaxis = self.joypads[joypad_id].get_axis(0) yaxis = self.joypads[joypad_id].get_axis(1) if xaxis > 0.9: if self.keysupp.press("%d %d" % (joypad_id, K_RIGHT)): self.set_cursor_pos(1, 0) elif xaxis < -0.9: if self.keysupp.press("%d %d" % (joypad_id, K_LEFT)): self.set_cursor_pos(-1, 0) elif yaxis > 0.9: if self.keysupp.press("%d %d" % (joypad_id, K_DOWN)): self.set_cursor_pos(0, 1) elif yaxis < -0.9: if self.keysupp.press("%d %d" % (joypad_id, K_UP)): self.set_cursor_pos(0, -1) # ボタン for button_id in range(self.joypads[joypad_id].get_numbuttons()): if self.joypads[joypad_id].get_button(button_id): self.menu_actions[self.cursor_logical_y][self.cursor_logical_x]() # キーボードによるカーソル操作 if Key.is_press(K_RIGHT): if self.keysupp.press(K_RIGHT): self.set_cursor_pos(1, 0) elif Key.is_press(K_LEFT): if self.keysupp.press(K_LEFT): self.set_cursor_pos(-1, 0) elif Key.is_press(K_DOWN): if self.keysupp.press(K_DOWN): self.set_cursor_pos(0, 1) elif Key.is_press(K_UP): if self.keysupp.press(K_UP): self.set_cursor_pos(0, -1) elif Key.is_press(K_RETURN): self.menu_actions[self.cursor_logical_y][self.cursor_logical_x]()