Python 3.x Python列表未返回复杂对象的正确值
我正在使用Python3.6.9和pygame库编写一个platformer游戏。我正在尝试创建所有游戏对象,然后将它们全部放在一个列表中,以便在gameObjectList循环中以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
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。我不知道为什么之前没有列表的代码可以工作,所以我将把这个问题留给别人,以防有人能解释它的行为,但是谢谢你帮助我解决它。问题解决了吗?