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

Pygame处理精灵表时遇subsurface rectangle outside surface area报错求助

Pygame精灵表提取报错问题解答

疑问一:为何矩形会超出表面范围?

问题出在你循环中修改了img变量:

  • 第一次循环(x=0)时,你从原始1440x80的精灵表中成功提取了(0,0,80,80)的子表面,并将这个80x80的小Surface赋值给了img。
  • 从第二次循环(x=1)开始,你操作的img已经是80x80的小Surface了。此时计算的frame_location是80*1=80,对应的矩形是(80,0,80,80),但这个小Surface的宽度仅为80,x坐标80已经超出了它的有效范围(Surface的坐标是从0到79),因此每次都会触发subsurface rectangle outside surface area错误。

疑问二:为何触发异常仍能生成18个对象?

因为你用try-except捕获了异常:

  • 当报错时,img = img.subsurface(img_rect)这行代码不会执行,img会保留上一次循环的值。
  • 比如x=0时成功生成第一个子表面;x=1时报错,img还是x=0时的那个Surface,随后被添加到列表;x=2到17时同理,每次添加的都是同一个重复的Surface。最终列表里有18个对象,但除了第一个,剩下的都是重复的实例。

修正后的代码

核心是保留原始精灵表的引用,每次从原始表中提取子表面:

import pygame as pg
pg.init()

animations = {"animation": []}
sprite_frame_number = 18

# 保留原始精灵表,不修改这个变量
spritesheet = pg.Surface((1440, 80))  
frame_size = [int(spritesheet.get_width() / sprite_frame_number), spritesheet.get_height()]  

for x in range(sprite_frame_number):
    frame_location = [frame_size[0] * x, 0]
    img_rect = pg.Rect(frame_location, frame_size)
    
    try:
        frame = spritesheet.subsurface(img_rect)
        animations["animation"].append(frame)
    except ValueError:
        print(f"提取第{x}帧失败")        

print(animations)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:36:23