Actionscript 3 as3mvc设计多个控制器
所以我正在读一本关于MVC的书,作者创建了一个控制器(PlayerController),并将一些函数用于键盘,一些用于鼠标。但他只是注释掉了每一个键盘的使用 它给了我一个想法,创建了两个控制器,PlayerMouseController和PlayerKeyboardController,这样我就可以决定如何控制玩家改变一条线。如果我可以这样设计,以后我可以为使用相同视图和模型但受AI控制的怪物添加一个AI控制器等等 我有我的模型播放器,它可以做物理方面的事情。现在我想要两个控制器,一个用于鼠标,另一个用于键盘。所以我创建了一个PlayerMouseController和PlayerKeyboardController PlayerMouseController有两个函数:processUpdate()和processMouseDown() PlayerKeyboardController有两个函数:processKeyDown()和processKeyUp() 我创建的对象如下所示:Actionscript 3 as3mvc设计多个控制器,actionscript-3,model-view-controller,Actionscript 3,Model View Controller,所以我正在读一本关于MVC的书,作者创建了一个控制器(PlayerController),并将一些函数用于键盘,一些用于鼠标。但他只是注释掉了每一个键盘的使用 它给了我一个想法,创建了两个控制器,PlayerMouseController和PlayerKeyboardController,这样我就可以决定如何控制玩家改变一条线。如果我可以这样设计,以后我可以为使用相同视图和模型但受AI控制的怪物添加一个AI控制器等等 我有我的模型播放器,它可以做物理方面的事情。现在我想要两个控制器,一个用于鼠标
_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通常不会给出此类答案,因为此类问题的每个答案都是主观的,本网站更适合发布问题/解决方案类帖子