所以我正在读一本关于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);
}
所以......这是一个好主意?我应该如何改进?
答案 0 :(得分:1)
我认为随着您的项目的发展,您很快就会遇到这种方法的瓶颈。我建议创建一个通用的IEntityController
接口(不要害怕'实体'这个词,它只是表明这是一个游戏对象控制器,例如英雄,敌人等的父母。 )。
然后我创建了这个接口的两个独立实现:BasicMouseController
和BasicKeyboardController
,这样我就有了两个具有基本逻辑的控制器分支。如果您需要Hero的其他功能,您将创建一个HeroMouseController
类,它将扩展BasicMouseController
类,并且具有调用super
方法和轻松添加扩展功能的优势。
您仍然可以将不同的控制器传递给PlayerView
类,因为它的构造函数会接收IEntityController
作为参数,这意味着可以传入实现此类的任何内容。
对于像这样的问题有很多方法,StackOverflow通常不是为了给出这样的答案,因为这些问题的每个答案都是主观的,这个网站更适合问题/解决方案类型的帖子。