diff --git a/src/scenes/main_menu_scene.py b/src/scenes/main_menu_scene.py index 26f4717..8bf854a 100644 --- a/src/scenes/main_menu_scene.py +++ b/src/scenes/main_menu_scene.py @@ -20,9 +20,12 @@ class MainMenuScene(BaseScene): self.button_status = False self.mouse_status = None self.mouse_last_status = None - self.debug_status = False + self.debug_status = True self.secret_keys = ["w","w","s","s","a","d","a","d"] # 上上下下左右左右 self.secret_key_compare_num = 0 + self.select_id = 0 + self.mouse_on_option = False + self.keyboard_ensure_status = False # 设置字体 font_file = os.path.join(data_path(),"Dymon-ShouXieTi.otf") @@ -52,6 +55,12 @@ class MainMenuScene(BaseScene): # 显示选项文本 self.__show_ui() + # 处理鼠标点击 + self.handle_mouse_click() + + # 处理空格或enter + self.handle_keyboard() + # 雨滴坠落 self.rain_fall() @@ -60,6 +69,8 @@ class MainMenuScene(BaseScene): # 更新当前帧鼠标状态 self.mouse_last_status = self.mouse_status + # self.__show(self.select_id) + def handle_event(self, event): """ 接收主循环传来的事件并处理 @@ -70,6 +81,10 @@ class MainMenuScene(BaseScene): self.exit() # 退出游戏 elif keys[pygame.K_z] and keys[pygame.K_x]: # 同时按下Z和X self.button_status = True + elif event.key == pygame.K_SPACE or event.key == pygame.K_RETURN: + self.keyboard_ensure_status = True + else: + self.keyboard_ensure_status = False # 判断是否按顺序按下秘籍 if event.unicode.lower() == self.secret_keys[self.secret_key_compare_num]: @@ -77,6 +92,13 @@ class MainMenuScene(BaseScene): else: self.secret_key_compare_num = 0 + if event.type == pygame.KEYUP: + if event.key == pygame.K_w or event.key == pygame.K_UP: + self.select_id -= 1 + elif event.key == pygame.K_s or event.key == pygame.K_DOWN: + self.select_id += 1 + self.select_id = self.select_id % len(self.text_rect_list) + # 鼠标事件 if event.type == pygame.MOUSEBUTTONDOWN: self.mouse_status = "down" @@ -105,6 +127,32 @@ class MainMenuScene(BaseScene): info_text = self.font.render(info, True, Color.white) self.screen.blit(info_text, dest) + def handle_mouse_click(self): + """ + 处理鼠标点击 + """ + if self.__click() and self.mouse_on_option: + # 触发选项处理 + self.__handle_option() + + def handle_keyboard(self): + if self.keyboard_ensure_status: + # 触发选项处理 + self.__handle_option() + + def __handle_option(self): + """ + 处理选项,根据id执行 + """ + if self.select_id is None: + return + elif self.select_id == 0: + self.switch_to_scene("GameScene") + elif self.select_id == 1: + self.switch_to_scene("OptionScene") + elif self.select_id == len(self.text_rect_list) - 1: + self.exit() + def __rain_list_append(self, status=0): """ 向列表中添加一个雨滴,默认状态为0 @@ -122,6 +170,7 @@ class MainMenuScene(BaseScene): # 文本 text_list = [ "开始游戏(Z和X)", + "设置", "退出游戏(ESC)", ] # 转换为文本框 @@ -133,6 +182,7 @@ class MainMenuScene(BaseScene): 显示所有选项 """ screen_rect = self.screen.get_rect() # 获取屏幕矩形 + self.mouse_on_option = False # 未选中选项时重置状态 count = 0 for text in self.text_rect_list: text_rect = text.get_rect() # 获取文本矩形 @@ -143,15 +193,19 @@ class MainMenuScene(BaseScene): if text_rect.y < self.mouse_pos[1] < text_rect.y + text_rect.height \ and text_rect.x < self.mouse_pos[0] < text_rect.x + text_rect.width: pygame.draw.rect(self.screen, Color.white, text_rect, 1) - # 如果点击鼠标 - if self.__click(): - # 点击第一个选项 - if count == 0: - self.switch_to_scene("GameScene") - else: - self.exit() + # 更新选中id + self.select_id = count + # 更新鼠标状态 + self.mouse_on_option = True count += 1 + # 显示键盘选中 + if self.select_id is not None: + text_rect = self.text_rect_list[self.select_id].get_rect() + text_rect.centerx = screen_rect.centerx # 将文本居中到屏幕 + text_rect.y = screen_rect.y + self.select_id * 2 * text_rect.height + screen_rect.centerx/2 + pygame.draw.rect(self.screen, Color.white, text_rect, 1) + def init_rain(self, max_num): """