我正在使用 DirectX 在 C++ 中制作一个图形简单的 3D 游戏。我遇到的主要问题是如何有效地构建一些东西。现在我知道我在某些领域的目标,但不知道如何理想地执行它们。
例如,现在我将所有网格和纹理存储在一个资产类中,其中枚举定义指向每个资产。游戏开始时会通过创建 Asset 对象并对其进行初始化来加载所有网格和纹理。从那里我通过分配 Asset 对象给出的指针将网格和纹理加载到对象。这是解决这个问题的最好方法吗?
一个更难的话题是物品。为了争论起见,我要说我们正在处理风景。现在我的风景需要以下内容:
- 一个名字
- 一个网格
- 纹理(可选)
- 标志(例如 Destructible、Flammable 等)
- 状态(如燃烧、锁定、诅咒等)
- 能力(物体实际做的事情,例如在燃烧时受到损坏)
此列表中的前 5 项只是变量。但是能力困扰着我。前 5 个都可以存在于一个项目类中。但我不知道该怎么做是以某种方式将能力附加到对象上。
例如; 我希望对象具有“火焰新星”能力。在每回合开始时,该物体会损坏它附近的任何物体。
对我来说,这意味着每个对象都需要一个“Trigger_Phase_TurnStart()”或一些类似命名的方法,然后需要一个新的“Fire Nova”类,该类具有针对该触发器的独特操作和自己的额外变量(损坏、范围等)。所以现在我有了基础对象类和一个继承自它的新 Fire Nova 类。
但是现在如果我需要一个具有火焰新星和冰霜新星以及减速光环等能力的物体怎么办。基本上我需要一种方法来为对象添加触发效果,而不需要为每个对象创建一个新的对象类。
所以到最后我可以说:
(pseudo code of the object's components)
name = Elemental Orb
mesh = "Mesh_Sphere"
textures[] = "Tex_Ice", "Tex_Fire"
flags = OF_Destructible
status = SF_Cursed | SF_Burning
abilities[] = Fire_Nova, Frost_Nova, Slowing_Aura
而这个球体将只是具有所有这些属性的对象类。然后该对象将在适当的回合阶段激活每个存储的能力的触发器,以执行任何动作。
现在我在想我可能需要为每个拥有每个回合阶段或动作触发器(继承自基础能力类)的能力创建一个类,并让它们在对象从它的能力数组中调用它们时执行适当的动作。这是最好的方法吗?
作为一个单独的问题。一些标志需要额外的变量,否则这些变量是不必要的。例如,Destructible 意味着对象将具有健康状况,而没有标志它就不需要它,或者 Openable 项目需要一个内容数组。什么是在需要时分配这些变量的好方法?例如,我不需要每面墙都有健康和空的内容数组。
最后。假设上面列出的所有属性都是项目需要的,您建议我如何最好地存储它们?为了澄清,我希望能够写:
CreateItem(ITEM_CHAIR);
并让它返回带有名称、网格、纹理、标志、状态和能力的创建对象。什么结构可能适合实现这样的最终效果?
总结一下:
- 我当前的资产存储是否可行?
- 在不创建大量单独的对象类的情况下创建附加到对象类的能力的最佳方法是什么?
- 当相关标志不存在时,有没有办法限制变量(或至少是内存使用)?
- 哪种结构或格式最适合存储固定项目定义?
对不起,如果这有点啰嗦。如果您不能回答所有问题,那么仍然会感谢您的回答。问题二可能是我现在最优先考虑的问题。
谢谢你的时间 :)