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
相关产品推荐
相关产品推荐

