🙁 可怜的DreamFairy 被学校强迫性的,无工资去厦门中软海晟的实训1个月…. 每天都是乏味的事情。
=。= 虽然只是一个月,但是DreamFairy 还是很果断的花了200大洋,迁了光线网络。 然后开始了我的pureMVC之路。
接触MVC是早晚之事,之后开发网游,基本都是在相关框架内构建。避免之后工作中跟不上进度,于是开始了pureMVC学习之路。
经过了连续2天不断查阅资料,看了各种文档。终于理解了MVC各个模块的交互方式。 上传上来给自己留个纪念。
PureMVC是在基于模型、视图和控制器MVC模式建立的一个轻量级的应用框架,这种开源框架是免费的,它最初是执行的ActionScript 3语言使用的Adobe Flex、Flash和AIR,现在已经移植到几乎所有主要的发展平台,目前支持两个版本框架:标准和多核,总之,标准版提供了一种简单的编码分离的方法,按照MVC设计概念。除此之外,多版本允许多个PureMVC应用运行在同一个虚拟机。
在PureMVC实现的经典MVC元设计模式中,这三部分由三个单例模式类管理,分别是Model、View和Controller。三者合称为核心层或核心角色。
demo演示: 使用键盘方向键进行操作
类视图
文档类
[cc lang=”actionscript3″ nowrap=”false”]
package
{
import application.ApplicationFacade;
import application.controller.StartUpCommand;
import flash.display.Sprite;
[SWF(frameRate=”30″,width=”500″,height=”400″)]
public class Main extends Sprite
{
private var facade:ApplicationFacade;
public function Main()
{
//获取facade单例
facade=ApplicationFacade.getInstance();
//启动pureMVC
facade.sendNotification(ApplicationFacade.STARTUP,this);
}
}
}
[/cc]
控制中心
[cc lang=”actionscript3″ nowrap=”false”]
package application
{
import application.controller.StartUpCommand;
import org.puremvc.as3.interfaces.IFacade;
import org.puremvc.as3.patterns.facade.Facade;
public class ApplicationFacade extends Facade implements IFacade
{
public static const STARTUP:String=”startup”;
//静态获取facade
public static function getInstance():ApplicationFacade
{
if(instance==null)instance=new ApplicationFacade();
return instance as ApplicationFacade;
}
//在facade初始化的时候执行,并注册命令StartUpCommand
protected override function initializeController():void
{
super.initializeController();
registerCommand(ApplicationFacade.STARTUP,StartUpCommand);
}
}
}
[/cc]
多核命令
[cc lang=”actionscript3″ nowrap=”false”]
package application.controller
{
import org.puremvc.as3.core.View;
import org.puremvc.as3.interfaces.ICommand;
import org.puremvc.as3.patterns.command.MacroCommand;
public class StartUpCommand extends MacroCommand implements ICommand
{
//多核MacroCommand
public function StartUpCommand()
{
//加载Command队列
//初始化逻辑COmmand
addSubCommand(ModelCommand);
//初始化界面Command
addSubCommand(ViewCommand);
}
}
}
[/cc]
界面中介
[cc lang=”actionscript3″ nowrap=”false”]
package application.controller
{
import application.view.ApplicationMediator;
import org.puremvc.as3.interfaces.ICommand;
import org.puremvc.as3.interfaces.INotification;
import org.puremvc.as3.patterns.command.SimpleCommand;
public class ViewCommand extends SimpleCommand implements ICommand
{
public override function execute(notification:INotification):void
{
//注册界面中介
var main:Main=notification.getBody() as Main;
facade.registerMediator(new ApplicationMediator(ApplicationMediator.NAME,main));
}
}
}
[/cc]
业务逻辑
[cc lang=”actionscript3″ nowrap=”false”]
package application.controller
{
import application.model.RockProxy;
import org.puremvc.as3.interfaces.ICommand;
import org.puremvc.as3.interfaces.INotification;
import org.puremvc.as3.patterns.command.SimpleCommand;
public class ModelCommand extends SimpleCommand implements ICommand
{
public override function execute(notification:INotification):void
{
//注册数据代理
facade.registerProxy(new RockProxy(RockProxy.NAME));
}
}
}
[/cc]
界面中介
[cc lang=”actionscript3″ nowrap=”false”]
package application.view
{
import application.ApplicationFacade;
import application.model.RockProxy;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.ContextMenu;
import org.puremvc.as3.interfaces.IMediator;
import org.puremvc.as3.interfaces.INotification;
import org.puremvc.as3.patterns.mediator.Mediator;
public class ApplicationMediator extends Mediator implements IMediator
{
public static const NAME:String=”applicationmediator”;
public static const KEYDOWN:String=”keydown”;
public static const KEYUP:String=”keyup”;
public static const ROCKLOADED:String=”rockloaded”;
private var rockProxy:RockProxy;
public function ApplicationMediator(mediatorName:String=null, viewComponent:Object=null)
{
super(mediatorName, viewComponent);
//初始化视图
main.stage.scaleMode=StageScaleMode.SHOW_ALL;
//注册键盘监听
main.stage.addEventListener(KeyboardEvent.KEY_DOWN,_keyDown);
main.stage.addEventListener(KeyboardEvent.KEY_UP,_keyUp);
//绘制场景
drawAssets();
}
private function _keyUp(e:KeyboardEvent):void
{
//发送键盘按键松开的消息
sendNotification(ApplicationMediator.KEYUP,e.keyCode);
}
private function _keyDown(e:KeyboardEvent):void
{
//发送键盘按键按下的消息
sendNotification(ApplicationMediator.KEYDOWN,e.keyCode);
}
public function get main():Main
{
return viewComponent as Main;
}
private function drawAssets():void
{
rockProxy=facade.retrieveProxy(RockProxy.NAME) as RockProxy;
main.addChild(rockProxy.rockVO);
rockProxy.rockVO.x=200;
rockProxy.rockVO.y=0;
rockProxy.setRockValue(.98,12,5,0);
//创建rock的中介
facade.registerMediator(new RockMediator(rockProxy.rockVO));
//发送洛克加载完毕的通知
sendNotification(ApplicationMediator.ROCKLOADED,rockProxy.rockVO);
}
}
}
[/cc]
洛克视图中介
[cc lang=”actionscript3″ nowrap=”false”]
package application.view
{
import application.ApplicationFacade;
import application.model.VO.Rockman;
import flash.events.Event;
import flash.ui.Keyboard;
import org.puremvc.as3.interfaces.IMediator;
import org.puremvc.as3.interfaces.INotification;
import org.puremvc.as3.patterns.mediator.Mediator;
public class RockMediator extends Mediator implements IMediator
{
public static const NAME:String=”rockVOmediator”;
private var key:Object;
private var onJump:Boolean=false;
private var onWalk:Boolean=false;
public function RockMediator(viewComponent:Object=null)
{
super(NAME, viewComponent);
key=new Object();
}
override public function listNotificationInterests():Array
{
//表示对按键按下,松开,洛克加载完毕的事件感兴趣,进行订阅
return [ApplicationMediator.KEYDOWN,ApplicationMediator.ROCKLOADED,ApplicationMediator.KEYUP];
}
override public function handleNotification(notification:INotification):void
{
switch (notification.getName())
{
case ApplicationMediator.KEYDOWN:
var DownkeyCode:int=notification.getBody() as int;
key[DownkeyCode]=true;
break;
case ApplicationMediator.KEYUP:
var UpkeyCode:int=notification.getBody() as int;
delete key[UpkeyCode];
onWalk=false;
if(!onJump)rockVO.rock.gotoAndStop(“stand”);
break
case ApplicationMediator.ROCKLOADED:
rockVO.rock.gotoAndStop(“stand”);
rockVO.addEventListener(Event.ENTER_FRAME,onEnter);
break;
}
}
private function onEnter(e:Event):void
{
rockVO.dropSpeed+=rockVO.gravity;
rockVO.y+=rockVO.dropSpeed;
if(rockVO.y<200)
{
onJump=true;
}else
{
onJump=false;
rockVO.y=200;
rockVO.dropSpeed=0;
if(!onWalk)rockVO.rock.gotoAndStop("stand");
}
if(key[Keyboard.LEFT])
{
if(!onJump)
{
onWalk=true;
rockVO.rock.gotoAndStop("walk");
}
rockVO.scaleX=-1;
rockVO.x-=rockVO.moveSpeed;
}
if(key[Keyboard.RIGHT])
{
if(!onJump)
{
onWalk=true;
rockVO.rock.gotoAndStop("walk");
}
rockVO.scaleX=1;
rockVO.x+=rockVO.moveSpeed;
}
if(!onJump && key[Keyboard.UP])
{
onJump=true;
rockVO.rock.gotoAndStop("jump");
rockVO.dropSpeed=-rockVO.jumpPower;
}
if(rockVO.x<-10)
{
rockVO.x=510;
}
if(rockVO.x>510)
{
rockVO.x=-10;
}
}
public function get rockVO():Rockman
{
return viewComponent as Rockman
}
}
}
[/cc]
洛克数据代理
[cc lang=”actionscript3″ nowrap=”false”]
package application.model
{
import application.model.VO.Rockman;
import application.view.ApplicationMediator;
import org.puremvc.as3.interfaces.IProxy;
import org.puremvc.as3.patterns.proxy.Proxy;
public class RockProxy extends Proxy implements IProxy
{
public static const NAME:String=”RockProxy”;
private var _rock:Rockman;
public function RockProxy(proxyName:String=null, data:Object=null)
{
super(proxyName,_rock);
}
//设定一个批量赋值RockmanVO的api
public function setRockValue(gravity:Number,jumpPower:Number,moveSpeed:Number,dropSpeed:Number):void
{
rockVO.gravity=gravity;
rockVO.jumpPower=jumpPower;
rockVO.moveSpeed=moveSpeed;
rockVO.dropSpeed=dropSpeed;
}
public function get rockVO():Rockman
{
if(_rock==null)_rock=new Rockman();
return _rock as Rockman;
}
}
}
[/cc]
洛克VO数据
[cc lang=”actionscript3″ nowrap=”false”]
package application.model.VO
{
import flash.display.Sprite;
public class Rockman extends Sprite
{
private var _rock:Rock;
private var _gravity:Number;
private var _moveSpeed:Number;
private var _dropSpeed:Number;
private var _jumpPower:Number;
public function Rockman()
{
loadRock();
}
public function get dropSpeed():Number
{
return _dropSpeed;
}
public function set dropSpeed(value:Number):void
{
_dropSpeed = value;
}
public function get rock():Rock
{
return _rock;
}
public function set rock(value:Rock):void
{
_rock = value;
}
public function get gravity():Number
{
return _gravity;
}
public function set gravity(value:Number):void
{
_gravity = value;
}
public function get moveSpeed():Number
{
return _moveSpeed;
}
public function set moveSpeed(value:Number):void
{
_moveSpeed = value;
}
public function get jumpPower():Number
{
return _jumpPower;
}
public function set jumpPower(value:Number):void
{
_jumpPower = value;
}
private function loadRock():void
{
_rock=new Rock();
addChild(_rock);
}
}
}
[/cc]
pureMVC 的 View,Controller 部分通过消息机制进行交互,在 Controller 中注册 Model中 VO 的 Proxy,获取实际数据。 其中 Model 无法接收消息,只能发送消息,因此可以用在数据更新时进行广播。
由于 Controller 是 Command 的集合,但是 Command 是无状态的,因此像ENTER_FRAME 之类的状态监听是无法使用的。
也是由于这个原因,本因写在 Controller部分的逻辑,被写在了 View 的 Mediator 中了。 期待自己以后更加了解 pureMVC后再做改动吧~