【问题标题】:game design - handling bonuses / duck typing - python游戏设计 - 处理奖金/鸭子打字 - python
【发布时间】:2009-07-06 05:18:18
【问题描述】:

我目前在我的游戏设计中遇到了一个设计问题,不是很糟糕,但它让我很困扰,所以我想问问其他人的意见:-)

我目前正在试验 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 方式我我想知道如何管理我的奖金问题?

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

问候

【问题讨论】:

  • 炸弹在被发射螺栓时爆炸,它不会在玩家区域周围爆炸,它可以在屏幕上的任何位置,并且绝对与当前玩家位置无关。很抱歉让这个不清楚。

标签: python pygame duck-typing


【解决方案1】:

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

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)

或类似的。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我认为你在正确的轨道上 - 我会说“炸弹奖励”仍然与玩家对象相关,因为它会影响玩家周围的敌人。您只需要像这样实现“炸弹奖励”的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()

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

      【讨论】:

      • 炸弹在发射螺栓时爆炸,它不会在玩家区域周围爆炸它可以在屏幕上的任何位置并且绝对与当前玩家位置无关,那是我的重点是说这个奖金和玩家之间没有关系。但是您的实现可以用于另一种奖励,例如盾牌,谢谢:)
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-05
        • 2017-11-06
        • 1970-01-01
        • 2010-12-30
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        • 2021-08-06
        相关资源
        最近更新 更多