所以我在製作一個遊戲,所有對象都來自一個GameObject類,它看起來像這樣;Python:回調問題
class GameObject(pygame.sprite.DirtySprite):
actions = dict()
def __init__(self):
pygame.sprite.DirtySprite.__init__(self)
self.rect = None
self.state = None
def update(self):
if callable(self.__class__.actions[self.state]):
#If this key has a function for its element...
self.__class__.actions[self.state](self)
現在,我遇到了繼承的另一個問題。觀察下面的課程,以及源自它的兩節課。
class Bullet(gameobject.GameObject):
FRAME = pygame.Rect(23, 5, 5, 5)
STATES = config.Enum('IDLE', 'FIRED', 'MOVING', 'RESET')
def __init__(self):
gameobject.GameObject.__init__(self)
self.image = config.SPRITES.subsurface(self.__class__.FRAME)
self.rect = self.__class__.START_POS.copy()
self.state = self.__class__.STATES.IDLE
actions = {
STATES.IDLE : None ,
STATES.FIRED : start_moving,
STATES.MOVING : move ,
STATES.RESET : reset ,
}
class ShipBullet(bullet.Bullet):
SPEED = -8
START_POS = pygame.Rect('something')
def __init__(self):
super(self.__class__, self).__init__()
self.add(ingame.PLAYER)
class EnemyBullet(bullet.Bullet):
SPEED = 2
START_POS = pygame.Rect('something else')
def __init__(self):
super(self.__class__, self).__init__()
self.add(ingame.ENEMIES)
除了None
的Bullet.actions
每一個元素(靜態成員,你介意)是內Bullet
舉辦的活動。 Bullet
並不意味着自己創建;如果這是C++,那將是一個抽象類。所以會發生什麼,Bullet
的子類通過Bullet.actions
搜索每一幀來決定下一步該做什麼,取決於它們的狀態(它們是否在移動,是否被拍攝等)。然而,由於Bullet.actions
的元素是Bullet
的自己的方法,其子類正在執行那些而不是它們自己的擴展版本(它們調用父方法)。出於內存使用的原因,我不想重複這個回調字典。所以,我問這個; 我怎麼能通過它的父母字典充滿回調方法,並執行自己的版本,如果它存在的話,以及他們的父母的版本,如果它不是呢?
哪裏'start_moving','move'等在定義了碼? – BrenBarn
它們在'whateverclass .__ init__'之下定義,但在'whateverclass.actions'之上。爲了清晰起見,我只是將它們排除在外。 – JesseTG
爲什麼你把'actions'變成一個類變量? – BrenBarn