游戏中物体如何进行通信

3

考虑一个使用场景的游戏引擎。现在,一个场景可以有一个演员列表,这些是当前场景中的对象。伪代码可能如下:

class Scene
{
    public List<Actor> Actors { get; set; }
    ....
}

对于游戏循环,引擎会在场景对象上调用Update()方法,然后在所有演员上调用Update()方法。
现在,我的问题是:如果演员需要知道其他演员的情况,有什么好的方法可以让它们进行通信?例如,我可能有一个代表子弹的演员。这个子弹需要知道所有敌对演员(以便子弹可以杀死它们等)。我可以为每个演员提供一个句柄,该句柄引用演员所在的当前场景,但这听起来像是一个坏主意(将这种访问/权限提供给每个演员)。
如果可能的话,我想保持所有演员对其他演员和场景的盲目,并通过某些契约实现行为/通信,但我还没有想出任何东西。

演员们需要自动互动吗?比如自动路径规划之类的。我需要避免碰撞,所以需要“看到”周围的情况吗? 如果不需要,我建议让所有演员完全盲目,并让某个“上帝”进程监视所有互动。在超级进程中生成一些东西,用于监视子弹与其他演员的交叉点,并在演员内部触发某些事件。Actor.Die...或者Damage...等等。 - Nevyn
一个类似于观察者模式的东西可能可行,但就像你所说的那样,它只适用于事件。如果我需要演员根据其他演员自行表现怎么办? - Jesse
@Jesse,你说的“基于它们的角色自行表现”是什么意思?如果你只需要特定的信息,比如其他游戏对象移动到了那里,观察者模式就可以很好地解决。如果你需要更紧密的交互,你可以将一个对象组合成其他对象(参见:en.wikipedia.org/wiki/Composite_pattern)。如果你能给出一个例子,也许我可以想出更好的解决方案。 - webdreamer
1
生成一个“观察”过程怎么样?在需要这个过程的任何步骤中调用它,演员可以“观察”周围环境,在给定视野距离内,您可以报告最接近执行“观察”的演员的位置、身份和必要时状态。本质上,将其视为MUD。我四处张望,看到了什么? - Nevyn
谢谢Nevyn,我最终采用了你的建议和webdreamer的建议混合方案。 - Jesse
3个回答

1

这取决于你想做什么。如果你的游戏引擎是基于组合的,那可能是一个解决方案(我的意思是每个游戏对象不是由其类名定义,而是由组成它的对象定义,并且你可以与这些对象交互)。你也可以在场景中注册它们,并能够通过名称获取它们,或者通过类型获取现有数组(例如使用模板方法)。你还可以使用观察者模式:每个游戏对象实现提供服务的接口,其他游戏对象订阅该服务,并在该其他对象的值更新时进行更新。有很多有效的解决方案,我只是提供了一些更多的方案。这真的取决于你想从对象之间的交互中获得什么。


我决定为每个场景创建一个观察者,负责调用Actor派生类内部的方法。场景观察者可以访问场景中的所有演员,并且可以按类型获取。结果证明这种方法非常优雅 :) - Jesse
我喜欢观察者模式 :) 很高兴它起作用了。我也发现访问者模式通常很繁琐,尽管它看起来很漂亮。 - webdreamer

0
最常见的解决方案是使用访问者模式。维基百科中的示例讨论了一个CAD系统,但在这个背景下,游戏并没有太大的区别。

这个模式看起来有点过于复杂,不太适合我想要实现的目标(会有很多额外的代码)。 - Jesse

0

有很多方法可以干净地完成这个任务,但其中最简单的一种是使用中介者模式的某种变体。


我喜欢这个模式,但我不确定它是否适用于实时环境,因为对象可能需要根据其他对象来控制自己。 - Jesse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接