如何简化Pygame中处理按钮悬停点击逻辑的重复if判断语句?
简化方案
你可以将所有按钮的公共属性抽象为统一的配置集合,通过一次循环完成所有按钮的悬停检测、渲染、点击触发逻辑,无需重复编写判断语句。
步骤1:定义按钮配置列表
把每个按钮的矩形对象、文本对象、文本绘制坐标、点击回调函数统一存入列表:
# 可提前把颜色定义为常量方便统一修改 RED = (255, 0, 0) HOVER_RED = (180, 0, 0) buttons = [ # 格式:(按钮矩形对象, 按钮文本, 文本坐标, 点击回调函数) (singleplayer_button, singleplayer_button_text, (295, 400), singleplayer), (multiplayer_button, multiplayer_button_text, (727, 400), multiplayer1), (leaderboard_button, leaderboard_button_text, (291, 550), leaderboard), (credit_button, credits_button_text, (774, 550), credit), (register_button, register_button_text, (300, 700), register), (exit_button, exit_button_text, (737, 700), exit_window), ]
步骤2:遍历配置处理所有按钮逻辑
替换掉原来所有重复的if-else代码,仅保留下面这一段循环即可:
mx, my = pygame.mouse.get_pos() click = pygame.mouse.get_pressed()[0] for btn_rect, btn_text, text_pos, callback in buttons: # 判断是否悬停 if btn_rect.collidepoint(mx, my): # 绘制悬停状态 pygame.draw.rect(WIN, HOVER_RED, btn_rect) # 点击触发回调 if click: callback() else: # 绘制正常状态 pygame.draw.rect(WIN, RED, btn_rect) # 绘制按钮文本(两种状态都要绘制,直接放到判断外简化逻辑) WIN.blit(btn_text, text_pos)
额外优化建议
- 后续需要新增按钮时,只需要在
buttons列表里按格式添加对应配置即可,不需要新增判断逻辑 - 也可以封装成
Button类,把属性和绘制、点击检测方法都封装到类内部,后续维护更清晰
内容的提问来源于stack exchange,提问作者bruh
相关产品推荐
相关产品推荐

