2011-05-01 232 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