2012-07-20 84 views
0

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

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

难题是题目。为了辩论的缘故,我要说我们正在处理风景。现在我的风景需要如下:

  • 的名称
  • 网状
  • 纹理(可选)
  • 标志(如可破坏的,易燃等)
  • 状态(如燃烧,锁定,诅咒等)
  • 能力(事物的对象实际上呢,比如燃烧时被损坏)

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

例如;我希望物体具有“火焰新星”的能力。在每回合开始时,物体会对附近的任何物体造成伤害。对于我来说,这意味着每个对象都需要一个“Trigger_Phase_TurnStart()”或者一些类似命名的方法,然后需要一个新的“火焰新星”类以及它自己的唯一动作来触发这个触发器和它自己的额外变量(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 

而这个天体将仅仅是对象类所有这些属性。对象然后会在适当的转向阶段激活每个存储的异能触发器,以执行任何动作。

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

作为一个单独的问题。一些标志将需要额外的变量,否则将是不必要的。例如,可破坏将意味着对象将具有健康性,而没有该标志则不需要它,或者可打开项目将需要一组内容。在需要时将这些变量分配给什么是一个好方法?例如,我不需要每个墙都有健康和空的内容数组。

最后。假设上面列出的项目属性都是项目需求,那么您如何建议我最好地存储它们?为了澄清,我希望能够写出:

CreateItem(ITEM_CHAIR); 

并有此返回与名称,网格,纹理,标志,状态和能力创建的对象。什么样的结构可能适合达到这样的最终效果?

总结:

  1. 难道我目前的资产存储似乎是可行的?
  2. 什么是最好的方式来创建附加到对象类的能力,而无需制作大量单独的对象类?
  3. 当关联标志不存在时,是否有办法限制变量(或至少是内存使用情况)?
  4. 哪种结构或格式最适合存储固定项目定义?

对不起,如果这是一个有点长的啰嗦。如果你不能回答所有的问题,那么答案仍然值得赞赏。问题二现在可能是我的最大优先事项。

感谢您的时间:)

回答

0

我只想回答问题2,它看起来像你需要一个装饰图案。在OOP中,装饰者模式很有用,当你有很多成分并且想要装饰一个物体时,比如披萨。不幸的是,您需要为每种成分创建一个单独的课程,因此我认为您有正确的方法。好的一点是,使用decorator模式,你可以用abilites类重复包装对象,并在最后调用一个方法来完成所有的工作。

+0

这当然看起来像我之后。尽管从一些例子来看,它们中的大多数似乎要求装饰器存储初始对象而不是存储装饰器的对象。理想情况下,我希望获得一系列我可以访问他们和他们的能力的项目。这是可能的装饰者,或者我需要创建一个新的特定的物品每次我添加一个能力? 这是我正在看[装饰器示例]的示例(http://advancedcppwithexamples.blogspot.co.uk/2010/09/c-example-for-decorator-design-pattern.html) – user1539405 2012-07-20 02:23:00

+0

我没有认为这是可能的。装饰者就像一个包装类,你像洋葱一样重复包裹你的物体。 – Bytemain 2012-07-20 02:30:01

+0

啊,我主要问,因为我的主要担心是我不确定如何使用此方法来添加多个装饰器,我不确定如何添加这些装饰器,同时仍然能够使用单个对象数组列表来访问我的游戏组件。 – user1539405 2012-07-20 02:32:24