添加键盘上下选择

This commit is contained in:
chicrobot committed 2026-07-31 01:44:22 +08:00
1 parent 9c6dd12fd7
commit b864a5e82e
1 file changed
+62 -8
+62 -8
View File
@@ -20,9 +20,12 @@ class MainMenuScene(BaseScene):
self.button_status = False self.button_status = False
self.mouse_status = None self.mouse_status = None
self.mouse_last_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_keys = ["w","w","s","s","a","d","a","d"] # 上上下下左右左右
self.secret_key_compare_num = 0 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") font_file = os.path.join(data_path(),"Dymon-ShouXieTi.otf")
@@ -52,6 +55,12 @@ class MainMenuScene(BaseScene):
# 显示选项文本 # 显示选项文本
self.__show_ui() self.__show_ui()
# 处理鼠标点击
self.handle_mouse_click()
# 处理空格或enter
self.handle_keyboard()
# 雨滴坠落 # 雨滴坠落
self.rain_fall() self.rain_fall()
@@ -60,6 +69,8 @@ class MainMenuScene(BaseScene):
# 更新当前帧鼠标状态 # 更新当前帧鼠标状态
self.mouse_last_status = self.mouse_status self.mouse_last_status = self.mouse_status
# self.__show(self.select_id)
def handle_event(self, event): def handle_event(self, event):
""" """
接收主循环传来的事件并处理 接收主循环传来的事件并处理
@@ -70,6 +81,10 @@ class MainMenuScene(BaseScene):
self.exit() # 退出游戏 self.exit() # 退出游戏
elif keys[pygame.K_z] and keys[pygame.K_x]: # 同时按下Z和X elif keys[pygame.K_z] and keys[pygame.K_x]: # 同时按下Z和X
self.button_status = True 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]: if event.unicode.lower() == self.secret_keys[self.secret_key_compare_num]:
@@ -77,6 +92,13 @@ class MainMenuScene(BaseScene):
else: else:
self.secret_key_compare_num = 0 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: if event.type == pygame.MOUSEBUTTONDOWN:
self.mouse_status = "down" self.mouse_status = "down"
@@ -105,6 +127,32 @@ class MainMenuScene(BaseScene):
info_text = self.font.render(info, True, Color.white) info_text = self.font.render(info, True, Color.white)
self.screen.blit(info_text, dest) 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): def __rain_list_append(self, status=0):
""" """
向列表中添加一个雨滴,默认状态为0 向列表中添加一个雨滴,默认状态为0
@@ -122,6 +170,7 @@ class MainMenuScene(BaseScene):
# 文本 # 文本
text_list = [ text_list = [
"开始游戏(Z和X)", "开始游戏(Z和X)",
"设置",
"退出游戏(ESC)", "退出游戏(ESC)",
] ]
# 转换为文本框 # 转换为文本框
@@ -133,6 +182,7 @@ class MainMenuScene(BaseScene):
显示所有选项 显示所有选项
""" """
screen_rect = self.screen.get_rect() # 获取屏幕矩形 screen_rect = self.screen.get_rect() # 获取屏幕矩形
self.mouse_on_option = False # 未选中选项时重置状态
count = 0 count = 0
for text in self.text_rect_list: for text in self.text_rect_list:
text_rect = text.get_rect() # 获取文本矩形 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 \ 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: and text_rect.x < self.mouse_pos[0] < text_rect.x + text_rect.width:
pygame.draw.rect(self.screen, Color.white, text_rect, 1) pygame.draw.rect(self.screen, Color.white, text_rect, 1)
# 如果点击鼠标 # 更新选中id
if self.__click(): self.select_id = count
# 点击第一个选项 # 更新鼠标状态
if count == 0: self.mouse_on_option = True
self.switch_to_scene("GameScene")
else:
self.exit()
count += 1 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): def init_rain(self, max_num):
""" """