Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python列表未返回复杂对象的正确值_Python 3.x_List_Pygame_Pygame Surface - Fatal编程技术网

Python 3.x Python列表未返回复杂对象的正确值

Python 3.x Python列表未返回复杂对象的正确值,python-3.x,list,pygame,pygame-surface,Python 3.x,List,Pygame,Pygame Surface,我正在使用Python3.6.9和pygame库编写一个platformer游戏。我正在尝试创建所有游戏对象,然后将它们全部放在一个列表中,以便在gameObjectList循环中以for x的方式将它们全部显示在屏幕上 讨论中的每个游戏对象都有一个属性img,我将其分配给pygame.image.load(“slime character.gif”)。 这将图像存储为pygame.Surface对象。 窗口(屏幕)有一个函数blit,它获取一个曲面对象(图像)和一个x和y坐标对或一个pygam

我正在使用Python3.6.9和pygame库编写一个platformer游戏。我正在尝试创建所有游戏对象,然后将它们全部放在一个列表中,以便在gameObjectList循环中以
for x的方式将它们全部显示在屏幕上

讨论中的每个游戏对象都有一个属性img,我将其分配给
pygame.image.load(“slime character.gif”)
。 这将图像存储为pygame.Surface对象。 窗口(屏幕)有一个函数blit,它获取一个曲面对象(图像)和一个x和y坐标对或一个pygame.Rect,它从中获取x和y

我的代码是:

for x in gameObjects:
        screen.blit(x.img, x.rect)
但是它抛出了一个错误,说x.img是一个int。打印这个,它看起来是200。不使用迭代器
print(gameObjects[0].img)
打印这张图片也会得到同样的效果

但是,如果我打印对象本身的值
print(object1.img)
我会得到一个pygame.Surface对象,这就是我需要blit的

对我来说,硬编码每个可能出现的对象是不切实际的,所以我需要从对象列表中引用它们的图像。但当我这样做时,它会给我一个不正确的数据类型。是否有人知道为什么会发生这种情况/一种解决方法,以便我能够访问所需的数据

提前谢谢


编辑:多亏了Chris Doyle的一条评论才得以解决:我忘了把屏幕作为movableObjs的一个参数。不过,我把这个问题留到这里,以防任何人都能解释程序的行为(在没有列表的情况下工作,但从列表中引用时失败)。

首先,类名通常应该使用大写字母约定。请参阅。
通过
gameObjectRef
使用重命名
gameObjectRef
gameObj
通过
gameObj
movableObj
通过
movableObj
使用重命名


问题分别是
object2
movableObj
。类
movableObj
来自类
gameObj
gameObj
构造函数的第一个参数是screen。您必须在fht构造函数的超级调用中将
screen
传递给
gameObj
的构造函数:

gameObj.\uuuuu初始化(self、img、xpos、ypos、w、h、visible、active)

gameObj.\uuuuu初始化(自身、屏幕、img、xpos、ypos、w、h、可见、活动)

class movableObj(gameObj):
定义初始值(自身、屏幕、img、xpos、YPO、w、h、重力=1、xvel=0、yvel=0、,
可见=假,离开屏幕=假,活动=真):
gameObj.\uuuuuuuuuuuuuuuuuu初始(自身、屏幕、img、xpos、YPO、w、h、可见、活动)
重力
self.xvel=xvel
self.yvel=yvel
self.leaveScreen=leaveScreen
此外,在创建
movableObj
的实例时,必须将
screen
传递给构造函数:

object2=movableObj(imgslime,600,200,20,20,0,2,0)

object2=movableObj(屏幕,imgslime,600、200、20、20、0、2、0)

您可能应该调用supper方法在movableObj中初始化gameObj。我怀疑问题在于您直接调用gameobj的init方法的方式,您将movableobj作为第一个参数传入,img作为第二个参数传入,xpos作为第三个对象传入。在您的init方法中,这意味着movableobj将是self,img将是screen,xpos将在gameObj中使用img。可以尝试将父类初始化为
super(movableobj,self)。\uu init(screen,img,xpos,ypos,w,h,visible,active)
而不是调用其init方法directly@ChrisDoyle看了你的第一条留言之后,我再次检查了init方法和构造函数。结果我没能把屏幕放进movableObj。我不知道为什么之前没有列表的代码可以工作,所以我将把这个问题留给别人,以防有人能解释它的行为,但是谢谢你帮助我解决它。问题解决了吗?