使用以下代码段
class Missile:
instances = []
def __init__(self):
Missile.instances.append(self)
现在拿代码:
class Hero():
...
def fire(self):
Missile()
当英雄射击时,需要创建导弹并将其附加到主列表中。因此,当激活时,英雄对象需要引用该列表。以下是一些解决方案,但我确信还有其他解决方案:
我没有在gamedev上发布这个,因为我的问题实际上更为笼统:以前的代码是否合适?鉴于这种情况,是否有更多的Pythonic解决方案?
答案 0 :(得分:5)
问题:
答案 1 :(得分:2)
我过去做过的原因与你基本相同。我真的没有看到任何问题
也许在你的情况下,通过
使列表更有意义属于英雄对象答案 2 :(得分:2)
无论是Pythonic,我都会说优秀的OO练习要求Hero级别保留导弹列表。
(除非我遗漏了一些东西,而Missile
需要知道其他人吗?)
这样的事情可能是合适的:
class Hero():
def __init__(self):
self.missiles = []
def fire(self):
self.missiles.append(Missile())
如果你需要一个'全球'导弹列表而不是每个Hero
一个,那么我建议改为创建一个静态成员变量:
class Hero():
missiles = []
def fire(self):
Hero.missiles.append(Missile())
答案 3 :(得分:1)
你的代码没问题,你建议的前两个解决方案是可以接受的(虽然不完全理解第三个解决方案:什么列表是“列表”?)。
根据您的需要,如果有许多类需要这种跟踪系统(如子弹,火箭,地雷......),您可以将此跟踪逻辑移动到metaclass(用于实例化类的类) )。
本质上,您将type
类子类化并创建自己的“类构造函数”,然后使用语法:
__metaclass__ = my_metaclass_that_generate_classes_tracking_their_instantiation
在您要跟踪的课程中。
编辑:只是阅读您对原始问题的评论。如果你有更多的实体发射相同级别的导弹,那么最简洁的模式 - IMO - 就是让ech实体(Hero,BadGuy,Allied ......)保持自己的导弹对象列表。它模拟了您正在密切描述的世界,它将使代码维护更容易......
HTH!
答案 4 :(得分:1)
让角色跟踪他们射击的射弹可以正常工作,但这也意味着每当你移除那个角色时,它的射弹也会消失。如果我没记错的话,那就是当你摧毁悬停的MLRS时发生在太巴列太阳的事情 - 如果它在飞行中有任何导弹爆炸时,它们就会消失。
让角色更新功能返回它创建的射弹,所以更新循环可以将它们放在射弹列表中,也可以正常工作。每次更新处理多个射弹可以像返回一个列表一样简单 - 它可以是空的,也可以包含一个或多个射弹。
这就是我的建议:将射弹和角色(英雄,盟友,敌人等)存储在World对象中,并将对该对象的引用传递给需要与之交互的每个角色(通过发射射弹)进入世界,或通过检查附近的敌人)。对于你的英雄发射的每一枚导弹,他称他的世界为addProjectile功能。如果英雄需要执行影响游戏其余部分的其他操作,则World对象可以为其提供功能,而不必在特殊情况下使主更新循环混乱。
当然,您不仅限于一种方法。您可以随时组合它们。如果你有归位射弹,你可以给他们一个目标的参考,这样他们就可以在每次更新呼叫时更新他们的速度。如果你的射弹不能伤害射击它们的射弹,你可以给他们一个参考他们的“主人”。如果角色只能同时拥有2个射弹(如某些旧游戏),你可以让角色跟踪他们的活动射弹,这样他们就知道何时停止射击。你甚至可以让射弹跟踪他们的“朋友”,如果他们被爆炸,那么他们可以协调他们的运动,形成花哨的植绒模式。 ;)