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

使用pygame.transform.rotate()遇索引越界问题——PacMan游戏动画异常求助

问题分析与解决方案

嘿,我一眼就揪出问题所在啦!你遇到的IndexError: list index out of range和pygame.transform.rotate()本身没关系,完全是列表赋值的低级失误导致的。

问题成因详解

看你定义PAC_UP、PAC_LEFT、PAC_DOWN这三个方向精灵列表的代码:

PAC_UP = []
for x in range(4):
    image = sprite_sheet('pacman-spritesheet.png').get_image(x*24, 0, 24, 24)
    PAC_RIGHT.append(pygame.transform.rotate(image, 90))  # 这里错了!

你每次循环都是把旋转后的图片追加到PAC_RIGHT列表里,而不是PAC_UP自己的列表里!同理PAC_LEFT和PAC_DOWN也是一样的错误——这就导致PAC_UP、PAC_LEFT、PAC_DOWN三个列表始终是空的,当你在Player类里尝试访问PAC_UP[self.spritesheet_index %4]时,空列表自然会抛出索引越界的错误。

另外还有个小优化点:你每次循环都创建一个新的sprite_sheet实例,这会重复加载图片,影响性能,应该只创建一次精灵表实例。

修正后的代码

先修正列表赋值的错误,再优化精灵表的使用:

# 先创建一次精灵表实例,避免重复加载图片
pac_spritesheet = sprite_sheet('pacman-spritesheet.png')

PAC_RIGHT = []
for x in range(4):
    image = pac_spritesheet.get_image(x*24, 0, 24, 24)
    PAC_RIGHT.append(image)

PAC_UP = []
for x in range(4):
    image = pac_spritesheet.get_image(x*24, 0, 24, 24)
    PAC_UP.append(pygame.transform.rotate(image, 90))  # 改为追加到PAC_UP列表

PAC_LEFT = []
for x in range(4):
    image = pac_spritesheet.get_image(x*24, 0, 24, 24)
    PAC_LEFT.append(pygame.transform.rotate(image, 180))  # 改为追加到PAC_LEFT列表

PAC_DOWN = []
for x in range(4):
    image = pac_spritesheet.get_image(x*24, 0, 24, 24)
    PAC_DOWN.append(pygame.transform.rotate(image, 270))  # 改为追加到PAC_DOWN列表

关于pygame.transform.rotate()的额外提示

虽然这次问题和旋转无关,但还是要提醒你:pygame.transform.rotate()旋转图像后,图像的尺寸会变大(因为旋转后的矩形会贴合原图像的外接圆),这可能导致你的角色碰撞检测出现偏移。如果需要保持原24x24的尺寸,可以在旋转后裁剪图像,比如:

def rotate_and_crop(image, angle):
    rotated = pygame.transform.rotate(image, angle)
    # 以原图像中心为基准,裁剪回原尺寸
    rect = rotated.get_rect(center=image.get_rect().center)
    cropped = rotated.subsurface(rect)
    return cropped

然后在创建方向精灵时使用这个函数:

PAC_UP.append(rotate_and_crop(image, 90))

这样修改后,你的四个方向精灵列表都会被正确填充,索引越界的错误就会消失啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:34:55