2011-05-01 96 views
1

我目前正在制作游戏。我有2个类,我想要一个访问其他实例变量。我不知道如何做到这一点,或者如果可能的话。Python - 实例变量访问

在某些时候这两个类继承的类gameEngine
gameEngine < - 游戏
gameEngine < - SuperSprite < - 字符< - 敌人
gameEngine < - SuperSprite < - 字符< - 玩家

我的游戏类创建对象的实例变量self.player = Player(self),我希望能够在我的Enemy类中使用它,因此它可以执行self.player.x。所以我可以在敌人级制造人工智能,这样它就知道我的玩家。如何做到这一点的任何建议,我的逻辑可能是错误的,所以任何帮助将感激。如果我需要发布我的代码或任何东西,请告诉我。

这或我一直在试图传递一个对象到一个函数。所以鲍勃可以在游戏课上得到敌人AI。但是我收到一个错误'Enemy'对象不可调用。然而,它通过它,功能打印出信息,然后死亡。但如果我将self.enemyAi(self.bob)转换为点击状态,它可以正常工作。

if self.enemyWeakBtn.clicked: 
    print "spawning enemey" 
    self.bob = Enemy(self) 

    self.enemies.append(self.bob) 
    self.enemyGroup = self.makeSpriteGroup(self.enemies) 
    self.addGroup(self.enemyGroup) 
    self.enemyActive = True    

elif self.enemyActive: 
    print self.bob 
    self.enemyAi(self.bob) 
    print " active" 

回答

0

该错误可能是缺乏Enemy类的构造函数。通过运行:

self.bob = Enemy(self) 

它看起来在Enemy类的功能__init__(self, arg1)。如果没有提供,Python将无法将Enemy视为“可调用”,这意味着它不能像函数一样使用,或者在这种情况下用于使用一个参数调用构造函数。

1

如果我理解正确的话,你想有Enermy情况下,获取到播放器实例

的访问有2种方式来完成它。我在我的程序中使用第二种方法atm,并计划添加第一种方法。

第一种方式涉及让类有一个实例,并调用一个类方法允许获取该实例。

class Game: 
    instance = False 

    def __init__(self): 
     if self.__class__.instance: 
      raise RunTimeError("Game has already been initialized.") # RunTimeError might be a bad choice, but you get the point 
     self.__class__.instance = self 

    @classmethod 
    def getInstance(cls): 
     return cls.instance 

##>>> g = Game() 
##>>> g 
##<__main__.Game instance at 0x02A429E0> 
##>>> del g 
##>>> Game.getInstance() 
##<__main__.Game instance at 0x02A429E0> 
##>>> 
## Here you can have, in your enermy class, g = Game.getInstance(). And g.player will be able to access the player instance, and its properties 

第二种方法是我一直在努力。它涉及让游戏类在游戏中调节一切。含义:一切都是游戏中的变数。此外,每一个游戏变量(例如玩家)都会拥有一个名为game的属性,该属性返回到游戏实例。

例子:

class Player: 
    def __init__(self, game): 
     self.game = game 
     print self.game.enermy 

class Game: 
    def __init__(self): 
     self.enermy = "Pretend I have an enermy object here" 
     self.player = Player(self) 


##>>> g = Game() 
##Pretend I have an enermy object here 
##>>> g.player.game.enermy 
##'Pretend I have an enermy object here' 
##>>> 
## Iin your enermy class, self.game.player will be able to access the player instance, and its properties 

有些人可能会与具有第二种方式反对,我也看到了问题的额外步骤。也许有人可以对比较两者之间的关系2.

一个组合方法可能是我希望移动到,但是这提出了一些问题,你需要首先放在文件中,否则你可能会得到未定义的玩家或游戏未定义。虽然我认为它可以通过将2个类分成不同的文件来解决。

class Player: 
    def __init__(self): 
     self.game = Game.getInstance() 

class Game: 
    instance = False 

    def __init__(self): 
     if self.__class__.instance: 
      raise RunTimeError("Game has already been initialized.") # RunTimeError might be a bad choice, but you get the point 
     self.__class__.instance = self 

    @classmethod 
    def getInstance(cls): 
     return cls.instance