Pygame自定义类生成的矩形一闪即消失,如何让其常驻显示
问题原因&修复方案
- 实例属性未正确绑定:你在
__init__方法中定义的coin_1是局部变量,没有绑定到类实例上,实例后续无法访问这个金币矩形对象。 - 绘制逻辑仅执行一次:金币绘制代码只在类实例化时运行了一次,主循环中每次调用的
draw_window()会清空窗口重绘背景,刚画的金币直接被覆盖,就会出现“刚弹出就消失”的现象。 - 主循环无有效调用:主循环中写的
coin_class只是引用实例对象,没有调用任何类方法,不会执行金币绘制、碰撞检测的逻辑。 - 冗余错误操作:
pygame.init()放在主循环内重复执行是错误的,仅需要在程序启动时执行一次即可;原主循环末尾的递归调用main()会导致栈溢出,需要删除。
修正后代码
金币类修改
class Coin_Class: def __init__(self): # 将金币矩形绑定为实例属性,后续可通过self全局访问 self.coin_rect = pygame.Rect(425, 30, 40, 40) # 新增每帧调用的金币绘制方法 def draw(self): pygame.draw.rect(WIN, YELLOW, self.coin_rect) # 改造碰撞检测为实例方法 def check_collect(self, player): if player.colliderect(self.coin_rect): self.coin_rect.x = random.randint(0, 800) self.coin_rect.y = random.randint(0, 250) pygame.event.post(pygame.event.Event(coin_collected)) global score score += 1 print(score)
主逻辑修改
# 程序启动时仅初始化一次pygame pygame.init() # 实例化金币类 coin_class = Coin_Class() # 提前定义全局分数变量 score = 0 # 主循环 def main(): score_check = 0 clock = pygame.time.Clock() run = True while run: clock.tick(FPS) # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: run = False pygame.quit() exit() # 玩家移动逻辑 keys_pressed = pygame.key.get_pressed() player_movement(keys_pressed, player) # 先绘制窗口背景 draw_window() # 再绘制金币(保证金币在背景上层显示) coin_class.draw() # 执行金币碰撞检测 coin_class.check_collect(player) # 统一更新屏幕(如果你的draw_window()中已经调用了pygame.display.update(),可删除这行) pygame.display.update() if __name__ == "__main__": main()
注意:保证屏幕更新操作在所有绘制逻辑完成后执行,不要在多个位置重复调用
pygame.display.update(),避免出现闪屏问题。
内容的提问来源于stack exchange,提问作者Rachel Ambrose
相关产品推荐
相关产品推荐

