TypeError: cannot concatenate 'str' and 'pygame.Surface' objects

TypeError: cannot concatenate 'str' and 'pygame.Surface' objects

我目前正在自学游戏编程,我已经从 pygame 轻松上手了。我浏览了一个教程,向我展示了如何构建一个简单的游戏,现在我已经完成了它,我正在尝试以对我有意义的方式重新组织代码,并对其进行编辑和添加到它。

我试图改变的一部分是,我没有为一个角色加载一个“.png”文件,而是加载了一个列表,该列表将在我设计的 'move()' 函数中迭代角色看起来像是在移动。但是我一直 运行 出错,我不知道为什么。在我的代码开头附近(我所做的只是导入必要的模块并初始化 pygame 和一些必要的变量)我尝试执行以下代码:

badguyimgs = ['badguy.png', 'badguy2.png', 'badguy3.png', 'badguy4.png']
for img in badguyimgs:
    badguyimgs.append(pygame.image.load("resources/images/" + img))
    badguyimgs.remove(img)

我不断收到以下错误:

TypeError: cannot concatenate 'str' and 'pygame.Surface' objects

到目前为止,我已尝试初始化一个新变量 (resource = "resources/images/" + img) 并将其放在 "for" 循环的开头,然后将其插入 pygame.image.load()。我也尝试过使用 os.path.join("resource/images/" + img)。我试过使用完整路径名 ("c:\Users\ . . . \resources\images\" +img)。但是每当我尝试将路径名与列表中的文件名连接起来时,我都会得到上面的错误代码。我试着查看 pygame 文档,但在这种情况下没有看到任何帮助。我试过用谷歌搜索错误,但没有得到任何参考。 (虽然人们试图将 int 类型连接到字符串的很多问题......)我将不胜感激任何人可以提供的任何帮助,指出我为什么会遇到这种情况,以及可以解决它的方法。谢谢

看起来您正在做的是在遍历列表时将 pygame.surface 对象(您从 png 文件加载)附加到列表中。您正在成功加载图像。但是,在您的函数添加第一张图片并删除字符串后,您的列表如下所示:

badguyimgs = ['badguy2.png', 'badguy3.png', 'badguy4.png', pygame.image]

您仍在遍历列表,因此您的函数开始尝试连接字符串和 pygame.surface 对象。我建议创建一个空列表,并将加载的图像添加到该列表中,而不添加或删除原始图像中的任何内容。希望这对您有所帮助!

这里有一个例子来配合 PlatypusVenom 的解释:

file_names = ['badguy.png', 'badguy2.png', 'badguy3.png', 'badguy4.png']
images = []
for file_name in file_names:
    images.append(pygame.image.load("resources/images/" + file_name))

现在 pygame.Surface 个对象在 images 中,列表的变量名称不那么混乱了。另一种选择是使用 list comprehension:

images = [pygame.image.load("resources/images/" + file_name) for file_name in \
          ("badguy.png", "badguy2.png", "badguy3.png", "badguy4.png")]

这与您在发布的代码中的目的相似。字符串列表将从内存中删除,只在 images 列表中留下 pygame.Surface 个对象。