TypeError:无法连接'str'和'pygame.Surface'对象

时间:2015-01-14 03:33:21

标签: image python-2.7 pygame typeerror string-concatenation

我目前正在自学游戏编程,而且我已经开始使用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类型连接到字符串虽然... ...)我将不胜感激,任何人都可以给出任何帮助,指出我遇到这个问题的原因,以及可以解决的问题。感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

以下是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")]

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