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

Pygame无清屏渲染下卡片重复显示问题修复及点击上下切换交互需求实现

解决Pygame卡片点击重复显示的问题

嘿,我看到你遇到的问题了——点击卡片后原位置还留着旧的卡片图像,导致重复显示对吧?这其实是两个小问题导致的,咱们一步步解决:

1. 核心问题:未在主循环中清除屏幕

你当前的代码只在初始化时执行了一次screen.fill((10, 200, 100)),之后每次循环绘制卡片都是直接叠加在旧画面上。Pygame的blit是将图像绘制到屏幕的指定位置,不会自动清除之前的像素,所以旧位置的卡片会一直留在屏幕上,看起来像是重复了。

解决方法:把屏幕填充的代码移到主循环的最开头,确保每次循环都先清空屏幕再重新绘制所有元素:

def main():
    pygame.init()
    size = width, height = 1920, 1020
    screen = pygame.display.set_mode(size)
    
    def display_card(card):
        # 直接用预加载的card.image,不用每次load
        screen.blit(card.image, card.coordonates)
    
    game = MackaoGame("Test1", "Test2")
    while True:
        # 每次循环先清空屏幕
        screen.fill((10, 200, 100))
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                game.change_card_status(pygame.mouse.get_pos())
        
        card_count = 0
        for player, deck in game.player_decks.items():
            new_cards = []
            for card in deck:
                card.make_coordonates((50 * card_count + 500, 500))
                if card.status == "selected":
                    card.coordonates[1] -= 100
                new_cards.append(card)
                card_count += 1
            game.player_decks[player] = new_cards
        
        for player, deck in game.player_decks.items():
            for card in deck:
                display_card(card)
        
        pygame.display.update()

2. 次要优化:避免重复加载图片

你现在每次循环都会调用pygame.image.load(card.img),这会反复读取磁盘上的图片文件,不仅降低程序运行效率,还可能引发不必要的资源问题。咱们可以在Card类初始化时就预加载好图像,存在对象属性里:

修改utilities.py中的Card类:

import pygame  # 记得在utilities文件顶部导入pygame

class Card:
    def __init__(self, num, symbol, img, status):
        self.num = num
        self.symbol = symbol
        self.img = img
        self.status = status
        # 预加载Pygame图像对象,存在self.image里
        self.image = pygame.image.load(img)
        # 用Pygame的get_size()获取尺寸,替代PIL(如果不需要PIL的其他功能,可移除PIL依赖)
        self.img_width, self.img_height = self.image.get_size()
        self.coordonates = [0, 0]
        self.velocity = 0
    
    # 其他方法保持不变...

修改后的效果

  • 每次循环开始都会清空屏幕,旧位置的卡片会被背景色覆盖,不会再出现重复显示的问题;
  • 点击卡片时,卡片上移,原位置无残留;再次点击时,卡片下移恢复原位;
  • 预加载图片后,程序运行更流畅,不会因为反复读文件产生卡顿。

内容的提问来源于stack exchange,提问作者Darius Otincelescu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 11:12:46