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

