AS3 MVC设计多个控制器

时间:2013-12-26 05:50:36

标签: actionscript-3 model-view-controller

所以我正在读一本关于MVC的书,作者创建了一个控制器(PlayerController),并为键盘使用了一些功能,有些用于鼠标。但他只是评论每个键盘使用。

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

我有我的模型播放器,它做物理的东西。现在我需要两个控制器,一个用于鼠标,另一个用于键盘。所以我创建了一个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);
}

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

1 个答案:

答案 0 :(得分:1)

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

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

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

对于像这样的问题有很多方法,StackOverflow通常不是为了给出这样的答案,因为这些问题的每个答案都是主观的,这个网站更适合问题/解决方案类型的帖子。