forked from zhiyuan/Project1
添加键盘上下选择
This commit is contained in:
1 parent
9c6dd12fd7
commit
b864a5e82e
1 file changed
+62
-8
@@ -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):
|
||||||
"""
|
"""
|
||||||
|
|||||||
Reference in new issue
Block a user