看完了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后,感觉代码间的耦合性低了,便于管理。不过用的过程中还是存在很多问题了,可以参考一下官方的那份《最佳实践》文档,里面提供了一些好的建议。