【问题标题】:Model-view design in FlashFlash 中的模型视图设计
【发布时间】:2014-12-17 14:11:03
【问题描述】:

我正在创建一个简单的游戏来学习 Flash 编程。为了有一个干净的模型/视图分离,我想创建一个 Player 类,它只保存与用户相关的数据。我还创建了一个 StatusView 类,它扩展了 MovieClip 并对应于我在 Flash 项目中创建的影片剪辑符号。基本上,StatusView 将在屏幕上显示我的 Player 类的数据。

我习惯于使用侦听器来做这种事情,所以我找到了 EventDispatcher 类并添加了一个作为我的 Player 类的成员。我想让我的 StatusView 影片剪辑向我的 Player 类添加一个事件侦听器,以便在我更改 Player 类中的数据时它可以接收消息。

问题是,我似乎没有任何地方可以放置我的 Player 类以便 StatusView 可以找到它(添加侦听器)。项目中的所有内容都是由其中一个影片剪辑直接创建的,运行时似乎以任意顺序创建这些影片剪辑。例如,假设我创建了一个名为 GameView 的 MovieClip 元件,并在那里创建了 Player 的实例,而 GameView 是 StatusView 的父级。当 StatusView 被构造时,我希望能够从它的父级访问 Player,但那时 GameView 还没有运行它的构造函数代码。即使我等待 ADDED_TO_STAGE 事件也是如此。

我可以将游戏模型代码放在一个单例中,但这对我来说似乎是一种 hack。 Flash 中是否有一种最佳实践方法可以让我独立于所有 MovieClip 符号内容创建和访问我的游戏模型?

【问题讨论】:

    标签: actionscript-3 flash model-view-controller


    【解决方案1】:

    如果您想将模型的引用传递给视图的构造函数,但不自己调用构造函数(因为您不是通过代码创建对象),那么您在这里就不走运了。

    您可以改为在 View 上简单地定义一个方法来传递 Model 对象的引用:

    public function setModel(value:Model):void
    

    用法:

    view.setModel(player);
    

    没有“法律”规定您必须将模型传递给视图的构造函数。 为方便起见,您还可以创建一个集合函数:

    public function set model(value:Model):void
    

    用法:

    view.model = player;
    

    我觉得我不得不不同意 Singleton。单例的目的是保证它只有一个实例存在。就是这样。 它不能轻易地传递引用(因为获取单个实例的方法是静态的)。这是(IMO)一种不好的做法。 您可以将任何东西设为静态,以便“轻松”地传递它。但这会造成混乱,没有人这样做。 但是突然之间,仅仅因为单例模式使用了静态方法,很多人认为这是一种获取引用的聪明方法。我不敢苟同。

    【讨论】:

      【解决方案2】:

      首先,如果您只需要一个实例,您可以将 Player 类实现为单例。我不认为这看起来像 hack(例如,在 PureMVC 框架中,每个模型都是单例)。 其次,您可以在某个通用类(管理器)中创建 Player 类的实例并将它们发送到视图。

      附:另外,我想指出,您可以从 EventDisptacher 扩展您的 Player 类,而无需在 Player 类中创建特定字段“eventDispatcher”。我不知道哪种方法更好,但是这个方法更简单,恕我直言。

      【讨论】:

      • 同意。让 Player 扩展 EventDispatcher。
      猜你喜欢
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 2014-01-21
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多