Pygame切割精灵表后blit仅显示4个精灵 无法显示全部8个精灵
问题原因
你两处坐标计算逻辑都存在错误,最终导致8个正确加载的精灵仅4个显示在可视区域内:
- 精灵切割方法
getAllSprite的遍历逻辑、坐标步进规则完全写反,仅在精灵表为单行排列时能侥幸拿到正确结果,多行精灵表会直接切出无效内容 - 精灵渲染的换行判断条件错误,提前触发换行,导致后4个精灵被绘制到屏幕可视范围外
1. 切割逻辑修复
原代码存在三个明确问题:
- 行列循环维度写反:外层循环应该遍历纵向行数(按图片高度/单精灵高度计算),内层遍历横向列数(按图片宽度/单精灵宽度计算)
- 坐标步进逻辑错误:每次切完精灵后错误重置y坐标、提前步进x坐标,导致永远无法遍历同一列下的其他行精灵
- 换行判断条件无意义:
if y >= height在每次y累加单精灵高度后永远成立,完全没起到行遍历判断的作用
修正后的getAllSprite代码:
def getAllSprite(self,width,height): imWidth = self.spriteFile.get_width() imHeight = self.spriteFile.get_height() finals = [] # 外层遍历行(纵向) for row in range(int(imHeight / height)): # 内层遍历当前行的所有列(横向) for col in range(int(imWidth / width)): # 直接通过行列号计算当前精灵左上角坐标,避免手动步进错位 x = col * width y = row * height finals.append(self.getSprite(x,y,width,height)) return finals
2. 渲染逻辑修复
原代码的核心问题是判断时机和条件错误:你在blit完当前精灵后先累加x得到下一个精灵的x坐标,却用x+width >= resW作为换行条件,相当于提前判断「下下个精灵是否超出屏幕」就触发换行,导致每行仅能放3个精灵就提前换到下一行,后续精灵的y坐标很快超出屏幕高度无法显示。
修正后的渲染代码:
spriteSheet = SpriteSheet(basePath+"Sprites\\mmButtons.png") sprites = spriteSheet.getAllSprite(282,69) x,y = 0,0 for item in sprites: width, height = item.get_size() # 绘制前先判断当前位置是否放得下精灵,放不下再换行 if x + width > resW: x = 0 y += height tv.blit(item, (x,y)) # 绘制完成后再累加x坐标 x += width
内容的提问来源于stack exchange,提问作者LostSilverCoin
相关产品推荐
相关产品推荐

