0

我以前从未使用过 Flex/Actionscript,所以如果我问任何明显的问题,请原谅我,但在写这篇文章之前,我已经为此工作了 3 天(包括搜索 google 和 stackoverflow)。

我被要求修改使用基于 mini-IoC 的 MVC 框架制作的 Flex 4 游戏。我被要求制作的两个模组是一个游戏结束屏幕,它在介绍屏幕上显示最终得分和难度选择。我已经制作了游戏结束屏幕,并成功地设法让控制器在游戏计时器用完时将其调出。

所以现在,游戏结构如下:

Intro View -> Game View -> Game Over View

    ^                            |
    |__________ (retry?) ________|

第一个问题是将分数从 mainGame ActionScript 文件传递​​到游戏结束屏幕。

我尝试过的事情:

  • 在 gameOverViewBase 中导入 mainGame 并调用 gameOverView mxml 文件中的 mainGame.score 变量。

-编辑!!!= 如果我将 mainGame 中的 score 变量更改为常量,则上述方法有效,但如果它仍然是变量,控制器将不会加载 gameOverView 并且游戏位于空的 mainGame 视图中。

  • 每当玩家在游戏中得分时,制作一个函数,在 gameOverViewBase 中添加一个新的得分变量。
  • MainGame 结束时将分数作为参数传递给 GameOverView

controller.loadGameOver(score);

这似乎是最合乎逻辑的方式。因此,我通过游戏的其他组件设置了 loadGameOver 以将整数作为参数来跟踪该函数,直到我到达主游戏动作脚本文件:

public function loadGameOver(score:int) : void
    {
        loadView(GameOverView);
    }

loadView 函数(如下所示)是我卡住的地方,因为我看不到在哪里传递 'score' 参数。它看起来像这样:

private function loadView(viewClass:Class, modelClass:Class = null) : void
    {

        var view:View = new viewClass();
        if(!view) throw new Error("Could not load view");

        viewContainer.removeAllElements();
        viewContainer.addElement(view);         

        view.controller = this;

    }

第二个问题是介绍屏幕上的难度选择。我使用 mxml 文件中的 3 个按钮(简单、普通、硬)和 ActionScript 中的每个按钮完成了此操作:

protected function onEasyButtonClick() : void
    {
        set = "easy"
        controller.loadMainGame(set);
    }

再一次,我结束了上面的 loadView 函数。

总结一下:我需要知道如何在视图和模型之间传递数据。如果这不是理想的方法,我愿意接受您认为更好的任何其他方法。

谢谢你!

PS我可以将我的源代码发送给任何愿意帮助的人:)

4

1 回答 1

2

您没有指定使用哪个 MVC 框架会有所帮助。但是,分数绝对应该是模型的属性,并且模型数据应该可以直接访问视图,可能通过绑定(感谢 weltraumpirat),或者通过一些中间类。

我建议您查看一些现有的视图类,并尝试弄清楚它们是如何提供模型数据的。您可以使用这种方法来获取视图所需的数据。

[编辑]:

mainGame属性未在您的GameOverView实例上设置,因此您无法score通过绑定或跟踪访问其属性。控制器类的loadView方法接受一个Model类引用,它用于构造一个新Model实例以供 new 使用View。不幸的是,这对您没有用处,因为您需要为其创建GameOverView的实例(并且包含当前分数)。MainGameMainGameView

我不知道以下内容是否符合您正在使用的框架的理念。但是,我会更改loadView方法以接受 a 的实例Model而不是类引用,并创建和缓存对实例MainGame化控制器时的实例的引用。这样,您可以将相同的Model引用传递给创建它们的时间MainGameViewGameOverView时间。

    public class WhackAMoleBase extends Application implements IGameController
    {
        public var viewContainer:Group;
        private var mainGame:MainGame

        public function WhackAMoleBase() : void
        {
            super();

            // Create and cache an instance of the main game Model
            mainGame = new MainGame();

            addEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete);
        }

        public function loadIntroduction() : void
        {
            loadView(IntroductionView);
        }

        public function loadMainGame() : void
        {
            loadView(MainGameView, mainGame);
        }

        public function loadGameOver() : void
        {
            // Use the same instance of MainGame which the MainGameView 
            // has been using as the Model for the GameOverView
            loadView(GameOverView, mainGame);
        }

        // Accept a Model instance rather than a class Reference
        private function loadView(viewClass:Class, model:Model = null) : void
        {
            //Create a new instance of the supplied view
            var view:View = new viewClass();
            if(!view) throw new Error("Could not load view");

            //Clear any previous views in the container and add
            viewContainer.removeAllElements();
            viewContainer.addElement(view);

            //Property based dependency injection 
            view.controller = this;

            //There may or may not be a model required for the
            //requested view; check and instantiate appropriately
            if(model)
            {               
                //Give model reference to the controller
                //and link the view up to the model
                model.controller = this;
                view.model = model;
            }
        }

        private function onCreationComplete(event:FlexEvent) : void
        {
            //When the application is first created, we want to show the introductory view 
            loadView(IntroductionView);
        }

    }
于 2012-07-07T00:42:20.583 回答