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

Pygame游戏报错:argument 1 must be pygame.Surface, not list 求助

解决Pygame中TypeError: argument 1 must be pygame.Surface, not list错误

嘿,我一眼就揪出问题所在了!咱们先把这个报错拆明白:

TypeError: argument 1 must be pygame.Surface, not list

这个错误的核心是:你调用win.blit(turtle_image, (t_x, t_y))时,turtle_image是一个存储了3帧动画的列表,但pygame的blit()方法要求第一个参数必须是单个的Surface图像对象,直接传列表肯定会报错。

修复步骤

咱们可以参照你处理马里奥行走动画的思路,给乌龟的动画加个帧索引控制,一步步来:

  1. 添加动画控制变量
    在初始化代码段(turtle_image定义之后)加上这几个变量,用来跟踪当前显示的动画帧:
# 乌龟动画控制参数
turtle_idx = 0  # 当前显示的帧索引
turtle_anim_speed = 5  # 帧切换速度,数值越大动画越慢
turtle_frame_counter = 0  # 计数用,达到阈值就切换帧
  1. 优化乌龟图像加载(可选但建议)
    你已经写了load_img函数处理图像透明,建议把乌龟的图像也用这个函数加载,和玩家图像保持一致的透明效果:
# 替换原来的turtle_image定义
turtle_image = [
    load_img('Sprites/Goomba1.png'),
    load_img('Sprites/Goomba2.png'),
    load_img('Sprites/Goomba3.png')
]
  1. 在主循环中更新动画帧
    在主循环的合适位置(比如背景滚动逻辑之后)添加帧切换逻辑:
# 更新乌龟动画帧
turtle_frame_counter += 1
if turtle_frame_counter >= turtle_anim_speed:
    turtle_idx += 1
    # 帧索引超出范围时,循环回到第一帧
    if turtle_idx >= len(turtle_image):
        turtle_idx = 0
    turtle_frame_counter = 0
  1. 修改blit调用
    把原来传列表的代码改成传当前索引对应的单个Surface对象:
# 替换原来的win.blit(turtle_image, (t_x, t_y))
win.blit(turtle_image[turtle_idx], (t_x, t_y))

额外小提示

我还注意到你主循环开头有一行win.blit(background_image,(sw, sh)),这个位置是屏幕右下角的外部,不会显示出来,还和后面的滚动背景逻辑重复了,建议删掉这一行,避免不必要的绘制操作。

这样修改之后,不仅解决了报错问题,乌龟还能正常播放动画,完全符合你做这个小游戏的初衷!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:24:08