Pygame开发国际象棋:棋子Sprite无法Blit到表面的修复方法及clock.tick作用解析
修复Pygame国际象棋棋子不显示问题 + 帧率限制的原因
首先解决你遇到的棋子无法显示的问题,你的代码里有几个关键问题导致棋子看不到:
问题分析与修复
- 错误的Blit调用方式:你在
showpiece里用pygame.Surface.blit(self.im, whitepawn, (self.x,self.y))是错误的,正确的Blit调用应该是目标Surface实例.blit(源Surface, 位置),而不是通过类调用。 - 未将棋子Surface绘制到屏幕:你把棋子Blit到了
self.im这个内部Surface,但从来没把self.im渲染到主屏幕screen上,自然看不到棋子。 - 冗余的空Surface:其实没必要创建
self.im这个空Surface,直接使用加载好的棋子图片即可。
修改后的完整代码
import pygame pygame.init() size = (600,600) # 可选:开启vsync减少屏幕撕裂,需要配合帧率限制 screen = pygame.display.set_mode(size, vsync=1) pygame.display.set_caption("chess") clock = pygame.time.Clock() # 加载图片时用convert/convert_alpha优化性能,透明图用convert_alpha chessboard = pygame.image.load("chess_board.png").convert() whitepawn = pygame.image.load("whitepawn.png").convert_alpha() blackpawn = pygame.image.load("blackpawn.png").convert_alpha() class pawn(pygame.sprite.Sprite): def __init__(self,colour,x,y): super().__init__() # 简洁调用父类初始化 self.x = x self.y = y self.moved = False # 加上self,变成实例属性(之前是局部变量) self.colour = colour # 根据颜色直接赋值对应的棋子图片 if self.colour == "white": self.image = whitepawn elif self.colour == "black": self.image = blackpawn # 设置rect属性,方便定位和后续碰撞检测 self.rect = self.image.get_rect(topleft=(x, y)) def showpiece(self, screen): # 直接把棋子图片Blit到主屏幕的对应位置 screen.blit(self.image, self.rect) num1 = 0 pawns = [] for i in range (8): pawns.append(pawn("black",0+num1,75)) pawns.append(pawn("white",0+num1,450)) num1 += 75 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 加上exit防止后续代码运行 screen.blit(chessboard,[0,0]) # 遍历棋子并调用showpiece绘制到屏幕 for p in pawns: p.showpiece(screen) pygame.display.flip() clock.tick(60) # 限制帧率为60FPS
关于帧率限制的原因
你提到的clock.tick(60)是用来限制游戏循环每秒运行60次,主要原因有这几点:
- 降低CPU占用:如果不限制帧率,游戏会尽可能快地执行循环,导致CPU核心满载,浪费系统资源,尤其是高性能电脑会出现不必要的发热、耗电。
- 保证跨设备速度一致:不同性能的电脑运行速度差异很大,不限制帧率的话,高性能电脑上游戏逻辑(比如棋子移动、动画)会跑得飞快,低性能电脑则会卡顿,限制帧率后,游戏在所有设备上的速度保持统一。
- 优化画面流畅度:配合
vsync垂直同步(在创建窗口时设置vsync=1),帧率限制可以减少屏幕撕裂现象,让画面过渡更平滑。
内容的提问来源于stack exchange,提问作者Nuusku_
相关产品推荐
相关产品推荐

