PureMVC实例入门
看完了PureMVC的源码,学习的官方的示例,就该自己整个demo出来了。我用它来实现一个非常简单的小游戏。一个小车(就是长方形),用键盘的左右方向键控制它的转向,向上键控制前进。
大概的效果图如下:
第一步,新建包目录,包括controller,model和view,view下面有个子package components。(见上图左半部分)
第二步,编写ApplicationFacade。里面初始化StartupCommand
override protected function initializeController( ) : void
{
super.initializeController();
registerCommand( STARTUP, StartupCommand );
}
public function startup( stage:Object ):void
{
sendNotification( STARTUP, stage );
}
{
super.initializeController();
registerCommand( STARTUP, StartupCommand );
}
public function startup( stage:Object ):void
{
sendNotification( STARTUP, stage );
}
第三步,编写StartupCommand,里面初始化小车的视图,注册相关的Mediator
public class StartupCommand extends SimpleCommand implements ICommand
{
override public function execute(notification:INotification):void{
var stage:Stage = notification.getBody() as Stage;
facade.registerMediator(new StageMediator(stage));
var car:Car = new Car();
facade.registerMediator(new CarMediator(car));
stage.addChild(car);
}
}
{
override public function execute(notification:INotification):void{
var stage:Stage = notification.getBody() as Stage;
facade.registerMediator(new StageMediator(stage));
var car:Car = new Car();
facade.registerMediator(new CarMediator(car));
stage.addChild(car);
}
}
第四步,编写小车的视图类Car,里面设计了相关键盘按下的操作变量,在EnterFrame里面更新小车的状态
private function updatePos(evt:Event):void{
if(leftArrow){
this.rotation -= TURN_SPEED;
}else if(rightArrow){
this.rotation += TURN_SPEED;
}else if(upArrow){
var angle:Number = Math.PI*(this.rotation/180);
var dx:Number = FORWARD_SPEED*Math.cos(angle);
var dy:Number = FORWARD_SPEED*Math.sin(angle);
this.x+=dx;
this.y+=dy;
}
}
if(leftArrow){
this.rotation -= TURN_SPEED;
}else if(rightArrow){
this.rotation += TURN_SPEED;
}else if(upArrow){
var angle:Number = Math.PI*(this.rotation/180);
var dx:Number = FORWARD_SPEED*Math.cos(angle);
var dy:Number = FORWARD_SPEED*Math.sin(angle);
this.x+=dx;
this.y+=dy;
}
}
第五步,编写小车的Mediator CarMediator,里面监听键盘事件更新后的Notification,然后更新Car的相关变量
override public function handleNotification(notification:INotification):void{
switch(notification.getName()){
case ApplicationFacade.TURN_LEFT:
car.leftArrow = true;
break;
case ApplicationFacade.TURN_RIGHT:
car.rightArrow = true;
break;
case ApplicationFacade.FORWARD:
car.upArrow = true;
break;
case ApplicationFacade.STOP_TURN_LEFT:
car.leftArrow = false;
break;
case ApplicationFacade.STOP_TURN_RIGHT:
car.rightArrow = false;
break;
case ApplicationFacade.STOP_FORWARD:
car.upArrow = false;
break;
}
}
switch(notification.getName()){
case ApplicationFacade.TURN_LEFT:
car.leftArrow = true;
break;
case ApplicationFacade.TURN_RIGHT:
car.rightArrow = true;
break;
case ApplicationFacade.FORWARD:
car.upArrow = true;
break;
case ApplicationFacade.STOP_TURN_LEFT:
car.leftArrow = false;
break;
case ApplicationFacade.STOP_TURN_RIGHT:
car.rightArrow = false;
break;
case ApplicationFacade.STOP_FORWARD:
car.upArrow = false;
break;
}
}
第六步,编写舞台的Mediator -StageMediator,里面监听键盘按下事件,然后发送相关的Notification
private function handleKeyDown(evt:KeyboardEvent):void{
switch(evt.keyCode){
case Keyboard.LEFT:
sendNotification(ApplicationFacade.TURN_LEFT);
break;
case Keyboard.RIGHT:
sendNotification(ApplicationFacade.TURN_RIGHT);
break;
case Keyboard.UP:
sendNotification(ApplicationFacade.FORWARD);
break;
}
}
private function handleKeyUp(evt:KeyboardEvent):void{
switch(evt.keyCode){
case Keyboard.LEFT:
sendNotification(ApplicationFacade.STOP_TURN_LEFT);
break;
case Keyboard.RIGHT:
sendNotification(ApplicationFacade.STOP_TURN_RIGHT);
break;
case Keyboard.UP:
sendNotification(ApplicationFacade.STOP_FORWARD);
break;
}
switch(evt.keyCode){
case Keyboard.LEFT:
sendNotification(ApplicationFacade.TURN_LEFT);
break;
case Keyboard.RIGHT:
sendNotification(ApplicationFacade.TURN_RIGHT);
break;
case Keyboard.UP:
sendNotification(ApplicationFacade.FORWARD);
break;
}
}
private function handleKeyUp(evt:KeyboardEvent):void{
switch(evt.keyCode){
case Keyboard.LEFT:
sendNotification(ApplicationFacade.STOP_TURN_LEFT);
break;
case Keyboard.RIGHT:
sendNotification(ApplicationFacade.STOP_TURN_RIGHT);
break;
case Keyboard.UP:
sendNotification(ApplicationFacade.STOP_FORWARD);
break;
}
用了puremvc后,感觉代码间的耦合性低了,便于管理。不过用的过程中还是存在很多问题了,可以参考一下官方的那份《最佳实践》文档,里面提供了一些好的建议。