【问题标题】:AS3 MVC Design Multiple ControllersAS3 MVC 设计多控制器
【发布时间】:2013-12-26 05:50:35
【问题描述】:

所以我正在阅读一本关于 MVC 的书,作者创建了一个控制器 (PlayerController) 并放置了一些功能供键盘使用,一些功能供鼠标使用。但他只是注释掉每个键盘的使用。

它让我想到了创建 2 个控制器,PlayerMouseController 和 PlayerKeyboardController,这样我就可以决定如何控制播放器更改一行。如果我可以这样设计,以后我可以为使用相同视图和模型但由 AI 控制的怪物添加一个 AIController 等等......

我有我的模型 Player,它可以做物理方面的工作。现在我想要两个控制器,一个用于鼠标,另一个用于键盘。所以我创建了一个 PlayerMouseController 和 PlayerKeyboardController。

PlayerMouseController 有 2 个函数:processUpdate() 和 processMouseDown() PlayerKeyboardController 有 2 个函数:processKeyDown() 和 processKeyUp()

我这样创建对象:

_player = new Player();
_playerController = new PlayerMouseController(_player);
_playerView = new PlayerView(_player, _playerController, stage);
addChild(_playerView);

如果我想更改控制器,我可以为此更改 _playerController 行:

_playerController = new PlayerKeyboardController(_player);

而且效果很好……但我不知道我使用的设计是否适合大型项目

为了完成这项工作,我必须创建一个没有任何内容的 Controller 类,以便我可以扩展其他控制器,并且我的视图可以调用所有方法。

    public class Controller 
    {       
        public function processKeyDown(e:KeyboardEvent):void
        {
        }

        public function processKeyUp(e:KeyboardEvent):void
        {
        }

        public function processUpdate(stage:Stage):void
        {
        }

        public function processMouseDown(e:MouseEvent):void
        {
        }
    }

在我看来(PlayerView)我接受任何控制器:

public function PlayerView(model:Player, controller:Controller, stage:Stage) 
{
        _model = model;
        _controller = controller;
        _stage = stage;
}

我根据它的类型决定使用什么:

if (_controller is PlayerKeyboardController)
{
    _stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
    _stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
}
else if (_controller is PlayerMouseController)
{
    _model.addEventListener(Model.UPDATE, onUpdate);
    _stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
}


// EVENTS PlayerKeyboardController
private function onKeyDown(e:KeyboardEvent):void 
{
    _controller.processKeyDown(e);
}
private function onKeyUp(e:KeyboardEvent):void 
{
    _controller.processKeyUp(e);
}

// EVENTS PlayerMouseController
private function onUpdate(e:Event):void 
{
    _controller.processUpdate(_stage);
}
private function onMouseDown(e:MouseEvent):void 
{
    _controller.processMouseDown(e);
}

所以...这是个好主意?我应该如何改进??

【问题讨论】:

    标签: actionscript-3 model-view-controller


    【解决方案1】:

    我认为随着您的项目的发展,您很快就会遇到这种方法的瓶颈。我建议创建一个通用的IEntityController 界面(不要害怕“实体”这个词,它只是表明这是一个游戏对象控制器,是英雄、敌人等的父级)。

    然后我将创建此接口的两个单独的实现:BasicMouseControllerBasicKeyboardController,这样我就有了这些具有基本逻辑的控制器的两个分支。如果您需要 Hero 的附加功能,您可以创建一个 HeroMouseController 类,该类将扩展 BasicMouseController 类,并具有调用 super 方法和轻松添加扩展功能的优势。

    您仍然可以将不同的控制器传递给PlayerView 类,因为它的构造函数将接收IEntityController 作为参数,这意味着任何实现此类的东西都可以传入。

    有很多方法可以解决此类问题,而 StackOverflow 通常不打算给出此类答案,因为此类问题的每个答案都是主观的,而且本网站更适合发布问题/解决方案类型的帖子。

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 2017-02-23
      • 2013-05-14
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多