AS3游戏元素结构

时间:2012-06-08 15:08:46

标签: actionscript-3 inheritance

我正在试图找出如何最好地为我的游戏设置一种通用游戏元素类。我想尝试和创造的结构也是类似的结构。

GameElementPositionMovement(根类)         - > GameElementVisual(处理所有图形)                  - > GameElementPersonality(处理游戏逻辑)

然后我希望能够通过创建GameElementPersonality的实例来设置不同的个性(怪物,英雄,图标等),但是在它的构造函数中也能够设置视觉和定位/运动方面。 / p>

我在另一个问题中提到了这一点,回复的答案是......

  

似乎你需要一种'数据模型'类来存储逻辑和a   视觉('视图')类。 Visual类不应该继承数据模型,   它应该使用它。这是与OOP相关的问题:IS vs HAS(继承   vs组成)

但我不确定我是否明白这一点。没有任何视觉数据的位置/运动,似乎是一个很好的第一根类,然后你添加到视觉方面(GameElementVisual),然后最后你添加个性“特征”(GameElementPersonality),如装甲,伤害,健康等

因此,我保持,定位/运动,视觉和逻辑分离,我推测我已经布置的heirachy将是最好的方法,但这不是一个好方法吗?它应该更平坦吗?使用GameElementPositionMovement,创建一个可视化和逻辑实例并将其存储在自身中?

2 个答案:

答案 0 :(得分:2)

您可以创建类似于此的结构:

(伪码)
elementData中

//it doesn't have to extend any particular class
//however it would be nice if it could  dispatch events and register listeners
class ElementData implements IEventDispatcher
{
    public function ElementData() //constructor 
    {
        //do some stuff
    }

    public function setSomeProperty(value:int):void
    {
        //
    }

    public function doSomeCrazyStuff():void
    {
        //
    }
}

<强> ElementVisual

class ElementVisual extends MovieClip //or just Sprite or even DiplayObjectContainer
{
    public function ElementVisual(elementData)
    {
        //constructor takes an instance of ElementData class

        elementData.addEventListener(CHANGE, onDataChange)

        elementData.doSomeCrazyStuff();
        if (userCliked)
        {
            elementData.setSomeProperty(15);
        }   

        //you can have here some interactions with user (keyboard, mouse)
        //then it can communicate with elenemtData and 'listen' what it says.
    }

    function onDataChange
    {
        //react accordingly
    }
}

一些视觉表现(您可能需要其中许多)

class Monster extends ElementVisual
{
    //do all the graphic, animations etc
}

然后你需要一个班级来设置所有数据,视觉效果等......在最简单的实现中,它可以是&#39;文档类&#39;。

它不是一个合适的MVC模型 - 它是一个简单的例子,展示了逻辑解耦的概念。

MVC不是唯一的解决方案,还有其他所谓的设计模式&#39;这可能有用...

答案 1 :(得分:0)

是的,MVC的想法是将事物分离,在你的情况下,你最终将所有东西都粉碎成一个继承链,你最终会得到一种类型的对象,它继承了继承所有属性的另一个对象的所有属性来自另一个对象的属性,所以你将拥有一个代表所有东西的东西的实例,这就是为什么这不是一个很好的模式。

如果您有一个GameElementPositionMovement类(您的主类),则创建GameElementVisual的实例,并在GameElementPersonality的实例中创建(或者如果需要,则创建多个实例)。然后,只要在GameElementPersonality(或者如果你选择创建一个集合的集合中的任何一个)中对属性进行更改就可以调度一个事件,主类GameElementPositionMovement可以监听调度的事件,当它获得它时可以设置/传递GameElementPersonality实例或数组到GameElementVisual。然后在GameElementVisual中你只是处理基于当前模型的绘图,模型与视图逻辑分离,你也可能想要在一个单独的类或GameElementPositionMovement中处理控件。 (控制是对模型的修改,在这种情况下,它可能也是你为用户事件,键盘,鼠标注册监听器的地方)

这样一来,模型仍然保持清晰的控制逻辑和视图逻辑,它清楚地分离了什么在哪里,实际上只有视图类型取决于模型和控制器类型取决于视图但是如果接口是建立的模型视图控制器每个都需要以这种方式相互通信,你可以用实现接口的新类交换任何这些部分(在小游戏中可能不是问题,但设计有助于这种能力和因此未来的可扩展性。)