代码之家  ›  专栏  ›  技术社区  ›  attwad

游戏设计-处理奖金/鸭子输入-python

  •  4
  • attwad  · 技术社区  · 15 年前

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

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

    谢谢你们读到这里,希望你们能帮我!

    当做

    4 回复  |  直到 15 年前
        1
  •  1
  •   Alex Martelli    15 年前

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

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

    并在 bomb bonus 班级。(正如您所提到的,您不必继承,但是如果这样做可以让您轻松地重用一些功能,那么这样做是没有问题的。)

    例如,玩家可以有一个属性 bomb ,正常情况下 None 炸弹奖金 班级可以做到:

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

    当对累积的所有奖金采取行动的时候,可以从

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

    诸如此类。

        2
  •  1
  •   RCIX    15 年前

    我不是用python写的,但我的建议是:给你的玩家装上他能得到的每一种武器(即使是通过奖励获得的武器),并将他通过奖励获得的武器的弹药设置为0。然后当你的玩家获得一个“炸弹奖励”(或者其他什么)时,在玩家的炸弹武器上增加一个弹药。这应该很管用。

        3
  •  0
  •   too much php    15 年前

    我认为你走对了方向-我认为“炸弹奖励”仍然与玩家对象有关,因为它影响到玩家周围的敌人。你只需要实施“炸弹奖励” 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
  •  0
  •   Mizipzor    15 年前

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