【问题标题】:What is the right OOP design of XNA 3D program?XNA 3D 程序的正确 OOP 设计是什么?
【发布时间】:2012-06-16 07:06:43
【问题描述】:

我想写一个简单的程序。

将有单个场景、一个摄像机和某些 3d 对象。我知道,如何实现这一点,这不是问题。问题是 - 如何在 OOP 原则中设计它。我打算制作一类相机和一类 3d 对象。

我的问题是谁在实现 Draw 方法?我认为相机需要实现draw方法,相机将合成BasicEffect和RasterizerState实例,并实现Update和Draw方法。我还想过什么,3D 对象将获取相机状态和设置并自行绘制,或者会有一些第三方类将获取 3D 对象的顶点和相机设置和状态并绘制所有内容。那么什么是正确的 OOP 设计?

【问题讨论】:

  • 太棒了!这些反对票...
  • 而不是回答问题或至少告诉我,我的问题有什么问题。

标签: c# oop 3d xna


【解决方案1】:

我想你可能问错了问题。

大多数时候,“正确的 OOP 原则”不会在游戏开发过程中出现。当然,在编写游戏代码时,如何将事物划分为类是相当明显的,而不是让“封装和所有那些爵士乐”100% 完美。

游戏开发中的“传统”方法最简单是拥有一个带有虚拟@的基类(例如:GameObjectActor) 987654324@ 和 Update 方法。然后为游戏中的每种对象创建一个类,该类继承自该基类并根据需要覆盖这些方法。

然后,您只需将这些类的实例粘贴到游戏类的列表中,然后在 Game.DrawGame.Update 中循环调用每个实例的相应方法。

您可能需要考虑添加除DrawUpdate 之外的其他方法。 LoadContent 就是一个很好的例子。

DrawableGameComponent 类是这种架构的一个很好的例子(注意它使用内置的Game.Components 作为它的列表)。我个人不推荐使用 XNA 的组件架构(我提倡自己滚动的方法)。但是,如果您之前从未见过 Draw/Update 的东西,那么值得一看。

为了处理你的相机对象,我建议让你的draw方法的签名看起来像这样:

public virtual void Draw(Camera camera)

这样每个游戏对象都可以访问相机并知道如何绘制自己。 (请注意,DrawableGameComponent 无法做到这一点。)

我强烈建议您查看this answer,它描述了可能的游戏架构 - 越来越复杂。特别是它更详细地介绍了“Actor 类”方法以及不同的 Actor 如何进行交互。

【讨论】:

    【解决方案2】:

    你的问题很广泛。您可以在Microsoft App Hub 查看示例。有许多基本示例,还有一些更复杂的示例,例如Ship Game 和其他几个完整的游戏。这可能会给你一些想法。

    【讨论】:

      猜你喜欢
      • 2011-10-19
      • 2015-08-24
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多