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

