什么是XNA 3D程序的正确OOP设计

本文关键字:OOP 设计 程序 XNA 3D 什么 | 更新日期: 2023-09-27 18:37:19

我想写一个简单的程序。

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

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

什么是XNA 3D程序的正确OOP设计

我想你可能问错了问题。

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

游戏开发中的"传统"方法,最简单的是拥有一个具有虚拟DrawUpdate方法的基类(例如:GameObjectActor)。然后,游戏中每种对象的类继承自该基类,并根据需要重写这些方法。

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

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

DrawableGameComponent 是此体系结构的一个很好的例子(请注意,它使用内置Game.Components作为其列表)。就我个人而言,我不建议使用XNA的组件架构(我提倡自己滚动的方法)。但是,如果您从未见过Draw/Update的东西,那么值得一看。

为了处理相机对象,我建议使绘制方法的签名如下所示:

public virtual void Draw(Camera camera)

这样,每个游戏对象都将能够访问相机并知道如何绘制自己。(请注意,这在DrawableGameComponent中是不可能的。

我强烈建议您看看这个答案,它描述了可能的游戏架构 - 越来越复杂。特别是,它更详细地介绍了"Actor类"方法以及不同参与者如何交互。

你的问题很广泛。可以在应用中心查看示例Microsoft。有许多基本示例,还有一些更复杂的示例,例如Ship Game和其他几个完整游戏。这可以给你一些想法来思考。