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

Pygame切割精灵表后blit仅显示4个精灵 无法显示全部8个精灵

问题原因

你两处坐标计算逻辑都存在错误,最终导致8个正确加载的精灵仅4个显示在可视区域内:

  • 精灵切割方法getAllSprite的遍历逻辑、坐标步进规则完全写反,仅在精灵表为单行排列时能侥幸拿到正确结果,多行精灵表会直接切出无效内容
  • 精灵渲染的换行判断条件错误,提前触发换行,导致后4个精灵被绘制到屏幕可视范围外

1. 切割逻辑修复

原代码存在三个明确问题:

  1. 行列循环维度写反:外层循环应该遍历纵向行数(按图片高度/单精灵高度计算),内层遍历横向列数(按图片宽度/单精灵宽度计算)
  2. 坐标步进逻辑错误:每次切完精灵后错误重置y坐标、提前步进x坐标,导致永远无法遍历同一列下的其他行精灵
  3. 换行判断条件无意义: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:03:24