You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 11:45:03