我目前面临的一个设计问题,在我的游戏设计,并不可怕,但它困扰我,所以我想问别人的意见:-)
我目前正在试验pygame,我已经开发了一个小的空间射手,现在我想处理一些奖金。
现在我有一个抽象的等级奖励,从中获得当前所有的奖励:一个“健康奖励”,它会给玩家一些健康,一个“死亡奖励”,它会把玩家的健康降低到1。
在我的游戏循环中,我所做的(大致)是:
def testCollisionBonusBolt():
#bolts are sprites fired by the player that allow him to get the bonuses
collisions = pygame.sprite.groupcollide(bonusesGroup, boltsGroup, True, True)
for col in collisions:
player.bonuses.append(col)
在我告诉玩家使用奖金之后
class Player:
...
def useBonuses(self):
for bonus in self.bonuses:
bonus.use(self)
到目前为止一切都还不错,但我想加上一个“炸弹奖励”,当玩家开枪时,炸弹会爆炸并杀死周围的敌人。
这个“奖金”实现了我的抽象类奖金的“使用(目标)”方法,但我觉得把这样的奖金添加到玩家的奖金列表中有点糟糕,因为他们之间应该没有关系!
奖金背后的概念是,这是“对某样东西有作用的东西”,以前是我的玩家等级的目标,但现在不是那么清楚了…
当然,在检测到哪些奖金被射中后,我可以测试奖金的类型(使用isinstance),例如奖金的类型,而不是调用player.useCanods(),但在所有讨论之后,我都读到了关于duck键入的内容以及为什么这是pythonic方法,我想知道如何处理奖金问题?
谢谢你们读到这里,希望你们能帮我!
当做
最佳答案
如果您不希望某个col
进入player.bonuses
而进入其他位置,请在抽象类toplayer
中使用默认实现创建一个Bonus
方法:
def toplayer(self, player):
player.bonuses.append(self)
并在
bomb bonus
类中重写它。(正如您所提到的,您不必继承,但是如果这样做可以让您轻松地重用一些功能,那么这样做是没有问题的。)例如,玩家可以有一个属性
bomb
,通常None
,而bomb bonus
类可以:def toplayer(self, player):
player.bomb = self
当对累积的所有奖金采取行动的时候,可以从
if player.bomb is not None:
player.bomb.explode(player.position)
或者类似的。