继承与组成


16

我用C#赚钱。通常,我会使用这种语言使用界面将所有事物解耦到高处。这在企业代码中为我提供了很好的服务,但是在C#中编写游戏时,由于能够为基类定义一些默认行为,因此我倾向于继承。但是我这样做很肮脏,就像我不服从曾经说过“赞成继承而不是继承”的建筑神一样。我知道它不是黑白的,但我也觉得我可以使用界面进行更多的工作,并大致实现相同的目的。

别人在做什么?是继承是游戏的正确方法,还是应该在某些接口中重构?


1
接口也不是组成,所以不清楚您要问什么。

我只想提一提,由于您使用的是C#,因此如果选择使用继承,将会很困难,因为C#不支持真正的多重继承。在进入4-5接口范围之前,必须使用多接口方法,并且必须在共享相同实现的每个类之间剪切/粘贴25行以上的代码。有一些工作回合,但由于该语言不提供直接支持,因此它们同样难看。
NtscCobalt 2011年

Answers:


23

游戏中的继承实际上是最糟糕的事情之一,尤其是在实体方面。阅读此内容以了解原因。重于继承的构图使您在玩游戏时走了很长一段路。至于引擎的其他区域,这并不重要。例如,假设您正在呼叫某种外部网络服务,则可以将一个通用类型的服务继承到例如。HTTPService和SocketService-与您惯用的企业应用程序非常相似。

除非您的游戏非常简单,否则您需要使用基于组件的实体(CBE)架构。通常的想法是,对于实体来说,它们如此普遍地组成而不是继承的原因是因为直到运行时您才知道给定实体将具有哪些功能。例如,将玩家的飞船带入太空射击游戏。直到游戏进行到某个时刻,您才知道玩家将要拾取,购买,出售,丢失,销毁什么武器,装甲,系统(即组件)等。因此,建模的唯一现实方法是通过对象组成。这种情况的好处是,您还可以具有完全可自定义的敌人,它们以相同的方式构建,而不是每次看到该敌人类型时总是完全相同的敌人。因此,对于CBE,您可能会看到“火星货轮”,并认为:“啊,它只有很小的激光,我会把它放下来的”,这通常是正确的,但是当您进入射程时,您突然意识到它有一个大屁股虫孔枪。惊喜惊喜!

组件化正在消除逻辑的隐式耦合,那就是“好”。


感谢您的建议:)很高兴知道我没有听到声音!
彼得·肖特

1
+1感谢您的文章,我一直想在自己的游戏中做到这一点
约翰·麦当劳

3
应该注意的是,由于游戏实体之间的高度依赖,继承通常会使事情变得复杂,并使可维护性和可扩展性成为一项繁琐的任务。组件系统很好地解决了这个问题,其他的好处是上面的答案中列出的内容;)
James

还应该指出的是,“但是当您突然进入射程时,您会意识到它有一个大屁股的虫洞枪。惊喜!” 游戏设计不好:D
乔纳森·康奈尔

1
惊喜很有趣,但是惊喜意味着您会毫无预兆地死去,就像一辆低水平的舰船会打扰您一样,令人沮丧;)当然,这可能并不是您在回答中所要表达的意思。此外,游戏不仅仅包含游戏设计。
乔纳森·康奈尔

3

对于那些讲德语的人来说,这是一本有趣的书:http ://www.amazon.com/Architektur-Kerns-einer-Game-Engine-Implementierung/dp/3639324471/ref=sr_1_1?ie=UTF8&qid=1314875533&sr =8-1

有关何时以及为什么使用哪种体系结构的详细信息,请参见:https//stackoverflow.com/questions/1901251/component-based-game-engine-design

我自己决定我的体系结构,取决于项目的规模以及扩展或重用代码的可能性。为什么要花大量的时间在微型项目的架构中,而又没有机会再次使用该代码?同时您可以完成项目。

组合与组件组合是很酷的东西,但是在大多数项目/体系结构中,组合也可以做(没有基于组件的开销)。这取决于您的组件系统可以提供的内容,而组合不能提供。


例如,将玩家的飞船带入太空射击游戏。直到游戏进行到某个时刻,您才知道玩家将要拾取,购买,出售,丢失,销毁什么武器,装甲,系统(即组件)等。因此,建模的唯一现实方法是通过对象组成。

早在没有组件的情况下,所有这些都是可能的


-1,成分是组成的一种形式。

好吧,是一种形式,但不尽相同,因为它们提供了不同的功能。(所以我不理解您的评论和-1)
idefix 2011年

1
当您说“成分与成分”时,您不清楚要比较的内容,因为成分成分。您是指动态组件还是静态组件?那些与类型组成之间既不是家族关系又不是结构关系?什么是“基于组件的开销”?在静态组件系统(以及许多动态组件系统)中,开销几乎为零。

嗯,有趣的观点。您介意进行更详细的讨论吗?如果没有,我想在另一个平台上向您发送我的邮件地址。
idefix 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.