4

我目前在我的游戏设计中面临一个设计问题,并不可怕,但它让我很困扰,所以我想问问其他人的意见:-)

我目前正在试验 pygame,我开发了一个小型太空射击游戏,现在我想处理一些奖金。

现在我有一个抽象类 Bonus 从中派生当前实现的所有奖金:一个“健康奖金”,它给玩家一些健康,一个“死亡奖金”,它把玩家的健康降低到 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)

到目前为止一切都还好,但我想添加一个“炸弹奖励”,当玩家射击时会爆炸并杀死周围的敌人。

这个“奖金”实现了我的抽象类 Bonus 的“use(target)”方法,但我觉得在玩家的奖金列表中添加这样的奖金有点糟糕,因为它们之间不应该有任何关系!

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

感谢您阅读本文,希望你们能帮助我!

问候

4

4 回答 4

1

如果您不希望某个col进入但在其他地方,请使用默认实现在抽象类中player.bonuses创建一个方法:toplayerBonus

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)

之类的。

于 2009-07-06T05:24:22.520 回答
1

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

于 2009-07-06T05:25:37.353 回答
0

我在几年前写的小行星克隆中有一个奖励系统。它现在在Bitbucket上存在(就像一个死项目可以存在一样)。我不认为它像你想要的那样灵活。但是小的“奖励”实体会生成并四处移动,如果它们与小行星相撞,奖励会被玩家移除并错过。如果玩家与它发生碰撞,则奖励积分。

于 2009-12-04T10:51:18.480 回答
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().

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

于 2009-07-06T05:37:29.793 回答