[转] PureMVC心得教程:使用puremvc框架实现的贪吃蛇

http://bbs.9ria.com/viewthread.php?tid=73554&extra=page%3D1%26amp;orderby%3Ddateline%26amp;filter%3D2592000

其实也只是我初用puremvc的心得。大多数理论查看资料验证过,不会误人子弟。
不是绝对理论化的东西。所以最好不要太过纠结了。内含详细注释。
应该可以让没有接触过此框架的同学们瞬间学会如何使用。

Puremvc的好处在什么地方:
mvc合理的区分可以便于扩展和维护,但是实际估计流水线上的同学们往往体会不到这种乐趣了。

不过个人认为Notification比event的优势在于无需提供消息发生者,从而在监听时也无需获得消息发出者的引用,从而降低耦合性
(换句话说应该叫降低设计降低系统耦合性的难度)。

一般推荐尽量封装mediator和proxy,然后使用command来调用方法实现view和model的通讯
这个游戏一般一条程序逻辑是
由view层发出请求(sendnotification),command监视到notification后,自动响应excute方法。在方法中获得所需proxy和media的引用,调用它们封装的api传递请求给proxy,proxy处理完数据后,再把更新的数据用notification带参数的形式发送到view层。View层可以直接在mediator中监听notification也可以还是通过command的形式处理业务逻辑。

数据处理的逻辑放在了model层。因为这个游戏是基于“贪吃蛇”,而不是基于”可以无穷变换的区块逻辑”。


Puremvc工程搭建心得
1.实例化一个applicationFacade

[code="java"]facade = ApplicationFacade.getInstance();
facade.sendNotification(ApplicationFacade.STARTUP, this);


这里的this就是应用程序顶层视图。

[code="java"]applicationFacade类一般小项目的写法都很类同。
override protected function initializeController():void
{
   super.initializeController();
   registerCommand(ApplicationFacade.STARTUP, StartupCommand);
}


这个StartupCommand往往也是添加两个子command

[code="java"]addSubCommand(ModelPrepCommand);
addSubCommand(ViewPrepCommand);


两个子command也都会按照FIFO原则先后触发

[code="java"]facade.registerProxy( new DataProxy() );//注册数据模型代理


和注册主视图

[code="java"]var main:Main = notification.getBody() as Main;
facade.registerMediator( new ApplicationMediator(main) );
     

主视图一般负责注册子视图,并且将视图组件添加到主视图中。
//画上主网格布局

[code="java"]tileFrame = new TileFrame(data.tileArray);
facade.registerMediator( new TileFrameMediator(tileFrame));
main.addChild(tileFrame);



//画上菜单

[code="java"]menu=new Menus();
facade.registerMediator(new MenuMediator(menu));
main.addChild(menu);
menu.y=tileFrame.y+tileFrame.height+20;    
 

接下来就任意发挥了,需要处理业务逻辑的时候,注册command(registerCommand)。
sendNotification来触发它。
Command中常常需要获得Proxy的引用(retrieveProxy)和mediator的引用(retrieveMediator)



[转] PureMVC心得教程:使用puremvc框架实现的贪吃蛇


如果只是简单业务逻辑,也可以使用mediator直接关注

[code="java"]override public function listNotificationInterests():Array{
     return([])//这个数组里写需要关心的notification
}
override public function handleNotification(notification:INotification):void{
switch( notification.getName() )
{
   Case xxx://消息名
//处理
Break;

}
}


关于游戏逻辑
游戏逻辑很简单,不是本篇主要。就不赘述了
简单概括,
snakeArr 记录蛇身所在各个区块的数组
tileArray 记录所有区块的状态。0,空白1,蛇身2,食物
headNo 蛇头所在区块
蛇头接受到移动命令后根据方向计算下一格所在区块,把tileArray中此格坐标设为蛇身,并加入snakeArr开头,如果新蛇头位置不是食物,把tileArray中蛇尾区块设置为空白,并将该蛇尾从snakeArr中移除,否则不做处理。如果蛇头新位置和蛇身数组中元素有相同,则死亡。


最后丢上代码。
src文件夹,纯代码actionscript项目,新建工程,放入src目录编译即可

你可能感兴趣的:(游戏,框架,PHP,bbs,actionscript)