游戏设计-处理奖金/鸭子类型-python
我目前在我的游戏设计中面临着一个设计问题,并不可怕,但它已经够困扰我的了,所以我想问问其他人的意见:-) 我目前正在试验pygame,我开发了一款小型太空射击游戏,现在我想处理一些奖金 现在我有一个抽象类奖金,从中衍生出当前实现的所有奖金:一个“健康奖金”,它给玩家一些健康,一个“死亡奖金”,它使玩家的健康下降到1 在我的游戏循环中,这里是我所做的(大致): 在我告诉玩家使用奖金之后游戏设计-处理奖金/鸭子类型-python,python,pygame,duck-typing,Python,Pygame,Duck Typing,我目前在我的游戏设计中面临着一个设计问题,并不可怕,但它已经够困扰我的了,所以我想问问其他人的意见:-) 我目前正在试验pygame,我开发了一款小型太空射击游戏,现在我想处理一些奖金 现在我有一个抽象类奖金,从中衍生出当前实现的所有奖金:一个“健康奖金”,它给玩家一些健康,一个“死亡奖金”,它使玩家的健康下降到1 在我的游戏循环中,这里是我所做的(大致): 在我告诉玩家使用奖金之后 class Player: ... def useBonuses(self): for bonus in
class Player:
...
def useBonuses(self):
for bonus in self.bonuses:
bonus.use(self)
到目前为止,一切都还不错,但我想增加一个“炸弹奖励”,当玩家射击时,它会爆炸并杀死周围的敌人
这个“奖金”实现了我的抽象类奖金的“使用(目标)”方法,就像其他人一样,但是我觉得在玩家奖金列表中添加这样的奖金有点不好,因为它们之间应该没有关系
奖金背后的概念是,这是“对某事做某事的东西”,以前是我的玩家等级的目标,但现在不太清楚。。。
当然,在检测到哪些奖金被射杀后,我可以测试奖金的类型(使用isinstance),而不是调用player.useBonuals(),例如奖金的类型,但是在我阅读了关于duck类型的所有讨论以及为什么它是python方式之后,我想知道如何处理奖金问题
谢谢你们的阅读,希望你们能帮助我
如果你不想让某个
col
进入玩家。奖金
但是在其他地方,在抽象类奖金
中使用默认实现创建一个顶层
方法:
def toplayer(self, player):
player.bonuses.append(self)
并在炸弹奖励
类中重写它。(正如您所提到的,您不必继承,但如果这样做可以让您轻松地重用功能,那么这样做也没有问题。)
例如,一个玩家可以有一个属性炸弹
,通常无
,而炸弹奖金
类可以:
def toplayer(self, player):
player.bomb = self
当对所有累积的奖金采取行动时,可以从
if player.bomb is not None:
player.bomb.explode(player.position)
或者类似的东西。我不是用python写的,但我的建议是:给你的玩家装载他能获得的每种武器(甚至是通过奖金获得的武器),并将他通过奖金获得的武器上的弹药设置为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()
班级奖金(奖金):
def使用(自身、玩家):
断言isinstance(玩家,玩家)
#TODO:找到所有靠近玩家的敌人-假设你
#将列表中的所有敌人对象都称为“敌人”
全球敌人
对于敌人中的敌人:
如果距离(玩家位置、敌人位置)<400:
#如果玩家与敌人之间的距离小于400
#(根据您的喜好更改此值),摧毁该敌人。
敌人爆炸
您需要自己设计distance()
的实现
在没有详细计划的情况下开发游戏意味着你经常会有一些新想法,这些想法几乎适合你现有的对象,你需要选择是用新功能扩展现有的类来支持你的新想法,还是创建一组新的类,因为你认为新想法太不一样了。这里没有对与错,只要确保你的想法以一种对你有意义的方式组织起来。我在几年前写的一个小行星克隆中有一个奖金系统。它现在还活着(就像一个死掉的项目一样)。我认为它不像你期望的那样灵活。但小的产卵和移动,如果他们,奖金将被删除和错过的球员。如果,奖励点数。炸弹在发射一颗箭时爆炸,它不会在玩家周围爆炸。它可以在屏幕上的任何位置,并且绝对与当前玩家的位置无关。我的意思是,此奖励与玩家之间没有关系。但是你的实现可以用来获得另一种奖励,比如盾牌,谢谢:)炸弹在发射一颗箭时爆炸,它不会在玩家周围爆炸,它可以在屏幕上的任何地方,绝对与当前玩家的位置无关。很抱歉把这说得不清楚。
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()