2009-07-06 75 views
4

我目前面临的一个设计问题,在我的游戏设计,并不可怕,但它困扰了我足够的,所以我想问问别人的意见:-)游戏设计 - 装卸奖金/鸭子类型 - 蟒蛇

我目前尝试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) 

直到现在everyt但是我想添加一个“炸弹加值”,当玩家射击时会爆炸并杀死周围的敌人。

这个“奖励”实现了抽象类Bonus的“使用(目标)”方法与其他人一样,但是我觉得在奖金列表中添加这样一个奖金是不好的,因为应该没有关系它们之间!

奖金背后的概念是,这是“对某事做某事的东西”,以前是我的玩家类的目标,但现在它不是那么清晰...... 当然不是调用player.useBonuses()在检测到哪些奖金在哪里拍摄后,我可以测试类型(使用isinstance),例如奖金,但是在所有关于鸭子打字的讨论之后,为什么这是pythonic方式,我在想如何管理我的奖金问题?

感谢您阅读这篇文章,希望大家能帮助我!

问候

+0

炸弹在炸弹上爆炸时,炸弹不会围绕玩家区域爆炸,而可能在屏幕上的任何地方爆炸,并且绝对与当前玩家的位置无关。 对不起,不清楚。 – attwad 2009-07-07 02:44:10

回答

1

如果你不想一定col进去player.bonuses但在其他地方,使抽象类Bonus一个toplayer法的默认实现:

def toplayer(self, player): 
    player.bonuses.append(self) 

,并覆盖它bomb bonus类。 (正如你所提到的,你不必继承,但是如果能让你轻松地重用功能就没有问题了。)

因此,例如玩家可以拥有属性bomb,通常为Nonebomb bonus类可以这样做:

def toplayer(self, player): 
    player.bomb = self 

而且在时机成熟时采取行动获得的所有奖金,这可能与

if player.bomb is not None: 
    player.bomb.explode(player.position) 

或类似的开始。

1

我不用python编写,但这里是我的建议:用他可以获得的每种武器(甚至通过奖金获得)加载你的玩家,并将他通过奖金获得的那些弹药设置为0。当你的玩家拿起一个“炸弹奖励”(或其他)时,向玩家的炸弹武器添加一个弹药。这应该很好地工作。

0

我认为你是在正确的轨道 - 我会说“炸弹奖励”仍然与玩家对象有关,因为它会影响玩家周围的敌人。你只需要执行“炸弹红利”的use()方法是这样的:

class BombBonus(Bonus): 
    def use(self, player): 
     assert isinstance(player, Player) 
     # TODO: find all enemies that are close to the player - assuming you 
     # have all enemy objects in a list call 'enemies' 
     global enemies 
     for enemy in enemies: 
      if distance(player.position, enemy.position) < 400: 
      # if the distance between player and an enemy is less than 400 
      # (change this value to your liking), destroy that enemy. 
      enemy.explode() 

你需要制定自己的实施distance()

开发没有一个详细的计划,游戏意味着你经常要具有几乎适合你现有对象的新思路,你需要选择是否使用新功能扩展现有的类,以支持新想法,或创建一套新的课程,因为你认为新想法太不同了。在这里没有对与错,只要确保你的想法保持组织的方式对你有意义。

+0

当炸弹爆炸时,炸弹爆炸,它不会在玩家区域周围爆炸,它可以在屏幕上的任何地方,并且绝对与当前玩家的位置无关,这是我的观点是说没有关系这个奖金和玩家之间。 但是你的实现可以用于另一种奖励,比如盾牌,谢谢:) – attwad 2009-07-07 02:43:10