游戏设计 - 处理奖金/鸭子打字 - 蟒蛇

时间:2009-07-06 05:18:18

标签: python pygame duck-typing

我目前在游戏设计中遇到了一个设计问题,并不是很糟糕,但它让我感到烦恼,所以我想问别人意见: - )

我目前正在尝试使用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.useBonuses(),例如奖金,但经过所有的讨论,我读到了鸭子打字以及为什么它是pythonic方式我我想知道如何管理我的奖金问题?

感谢你们阅读这篇文章,希望你们能帮助我!

问候

4 个答案:

答案 0 :(得分:1)

如果您不希望某个col进入player.bonuses但是在其他位置,请使用默认实现在抽象类toplayer中创建Bonus方法:< / p>

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 :(得分:1)

我不是用python编写的,但这是我的建议:用他可以获得的每种武器加载你的玩家(甚至是通过奖金获得的武器)并将弹药通过奖励设置为0.然后当你的玩家拿起一个“炸弹奖励”(或者其他什么)在玩家的炸弹武器上添加一个弹药。这应该很好。

答案 2 :(得分: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()实施方案。

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

答案 3 :(得分:0)

我在几年前写过的小行星克隆中有一个奖励系统。它现在在Bitbucket生活(尽可能多的死项目)。我认为它不像你想要的那样灵活。但是小"bonus" entities产生并移动,如果他们collide with an asteroid,奖金被玩家移除并错过。如果player collides with it,则奖励积分。

相关问题