Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 as3mvc设计多个控制器_Actionscript 3_Model View Controller - Fatal编程技术网

Actionscript 3 as3mvc设计多个控制器

Actionscript 3 as3mvc设计多个控制器,actionscript-3,model-view-controller,Actionscript 3,Model View Controller,所以我正在读一本关于MVC的书,作者创建了一个控制器(PlayerController),并将一些函数用于键盘,一些用于鼠标。但他只是注释掉了每一个键盘的使用 它给了我一个想法,创建了两个控制器,PlayerMouseController和PlayerKeyboardController,这样我就可以决定如何控制玩家改变一条线。如果我可以这样设计,以后我可以为使用相同视图和模型但受AI控制的怪物添加一个AI控制器等等 我有我的模型播放器,它可以做物理方面的事情。现在我想要两个控制器,一个用于鼠标

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

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

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

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

我创建的对象如下所示:

_player = new Player();
_playerController = new PlayerMouseController(_player);
_playerView = new PlayerView(_player, _playerController, stage);
addChild(_playerView);
如果我想更改控制器,我只需更改_playerController行即可:

_playerController = new PlayerKeyboardController(_player);
而且效果很好。。。但我不知道我使用的设计是否适合大型项目

为了实现这一点,我必须创建一个没有任何内容的控制器类,这样我就可以扩展其他控制器,并且我的视图可以调用所有方法

    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);
}

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

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

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

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

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