游戏:一般结构和游戏项目结构

时间:2012-07-20 00:56:06

标签: class object format items

我使用DirectX在C ++中制作图形简单的3D游戏。我遇到的主要问题是如何有效地构建一些东西。现在我知道我对某些领域的目标,但不知道如何理想地执行它们。

例如,现在我将所有网格物体和纹理存储在Asset类中,枚举定义指向每个资源。通过创建Asset对象并初始化它,在游戏开始时加载所有网格和纹理。从那里我通过分配Asset对象给出的指针将网格物体和纹理加载到对象。这是解决这个问题的最好方法吗?

更难的主题是项目。为了争论,我要说我们正在处理风景。现在我的风景需要以下几点:

  • 姓名
  • 网格
  • 纹理(可选)
  • 旗帜(如可破坏,易燃等)
  • 状态(如燃烧,锁定,诅咒等)
  • 能力(物体实际上做的事情,例如燃烧时受损)

此列表中的前5项内容仅为变量。但能力困扰着我。前5个都可以存在于一个项目类中。但是我不知道该怎么做才能以某种方式将能力附加到物体上。

例如;我希望对象具有“Fire Nova”能力。在每个回合开始时,物体会损坏它附近的任何物体。

对我来说,这意味着每个对象都需要一个“Trigger_Phase_TurnStart()”或一些类似命名的方法,然后需要一个新的“Fire Nova”类,它有自己对该触发器的独特动作及其自身的额外变量(Damage,范围等)。所以现在我有了基础对象类和一个继承它的新的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

这个orb就是具有所有这些属性的对象类。然后,对象将在适当的转弯阶段激活每个存储能力的触发器,以执行任何动作。

现在我想我可能需要为拥有每个转弯阶段或动作触发器(从基础能力类继承)的每个能力创建一个类,并让它们在对象从它的数组中调用它们时执行适当的操作能力。这是最好的方法吗?

作为一个单独的问题。某些标志需要额外的变量,否则这些变量是不必要的。例如,Destructible意味着对象将具有健康,而没有标志它将不需要它,或者Openable项目将需要一系列内容。在需要时将这些变量定量的最佳方法是什么?例如,我不需要每个墙都有健康和空内容数组。

最后。假设上面列出的子弹列出的属性都是项目需求,你怎么建议我最好存储它们?为了澄清,我希望能够写下:

CreateItem(ITEM_CHAIR);

并让它返回创建的对象,包括名称,网格,纹理,标志,状态和能力。什么结构可能适合实现这种最终效果?

总结:

  1. 我目前的资产存储似乎可行吗?
  2. 创建连接到对象类的能力而不创建大量单独的对象类的最佳方法是什么?
  3. 当相关标志不存在时,有没有办法限制变量(或至少是内存使用量)?
  4. 哪种结构或格式最适合存储固定项目定义?
  5. 对不起,如果这有点长啰嗦。如果您无法回答所有问题,那么仍然可以理解答案。问题二可能是我现在最重要的优先事项。

    感谢您的时间:)

1 个答案:

答案 0 :(得分:0)

我只想回答问题2,看起来你需要一个装饰模式。在OOP中,当您有许多成分并且想要装饰对象(例如披萨)时,装饰器图案很有用。不幸的是,你需要为每种成分创建一个单独的类,因此我认为你有正确的方法。好处是,使用装饰器模式,您可以使用abilites类来反复包装对象,并在最后调用一个方法来完成所有操作。

相关问题