白鹭(Egret)MVC框架(一)

原文链接: https://blog.csdn.net/u013617851/article/details/82980669

笔记一:通用框架的入门操作:制造一个基本Scene与界面

前言:

在公司已经搭建好的框架下进行开发,是一个从1到100的过程。

但是成为一名合格的游戏开发者,从0到1过程,同样也是必须掌握,必不可少的。

这里挑选了一个网上通用的白鹭H5框架进行学习。

这篇博客的源代码:笔记一建立基本scene

1.第一步下载相应的源代码以及白鹭引擎对应的版本。

框架源代码:https://github.com/yicaoyimuys/EgretGameEngine

框架简介地址:http://bbs.egret.com/forum.php?mod=viewthread&tid=14648&extra=

如果我们需要建立一个界面的Demo范例,通过查看框架代码可知,

DemoController和DemoView 注册在 ViewManager中,而DemoScene负责统领这些ViewManager以及资源,而DemoTest通过SceneManager统领DemoScene,而DemoTest在入口Main.ts中进行启动。

2.创建一个基本scene的详细步骤

2.1第一步创建一个DemoScene.ts,目录src/example/scene/DemoScene.ts:


  
  
  1. /**
  2. * Created by yangsong on 2014/11/28.
  3. * UI场景层
  4. */
  5. class DemoScene extends BaseScene {
  6. /**
  7. * 构造函数
  8. */
  9. public constructor() {
  10. super();
  11. }
  12. /**
  13. * 进入Scene调用
  14. */
  15. public onEnter(): void {
  16. super.onEnter();
  17. //添加该Scene使用的层级
  18. this.addLayer(LayerManager.UI_Main);
  19. this.addLayer(LayerManager.UI_Popup);
  20. this.addLayer(LayerManager.UI_Message);
  21. this.addLayer(LayerManager.UI_Tips);
  22. //添加一个纯色背景
  23. var rect: eui.Rect = new eui.Rect();
  24. rect.fillColor = 0x78b93f;
  25. rect.percentHeight = 100;
  26. rect.percentWidth = 100;
  27. LayerManager.UI_Main.addChild(rect);
  28. //初始打开Home页面
  29. App.ViewManager.open(ViewConst.Demo);
  30. }
  31. /**
  32. * 退出Scene调用
  33. */
  34. public onExit(): void {
  35. super.onExit();
  36. }
  37. }

DemoScenes继承自通用框架中已经写好的BaseScene,主要包括构造函数以及Scenes的生命周期的几个函数。其中比较重要的一句是App.ViewManager.open(ViewConst.Demo,);意思是调用ViewManager打开一个与名称”ViewConst.Demo”绑定好的View界面.

这里的ViewConst.Demo会在下文中进行绑定,View界面也会在下文中构建。建议了解一下中介者模式,能更好理解ViewManager的设计思路,因为View与View之间关系可能会错综复杂,牵一发而动全身,把View之间的调度通过中介者模式的思想统一交给ViewManager来管理和调度,会极大减少后期出现的View调度错误.

2.2 第二步 注册ViewManager 需要使用的ViewConst.Demo

    打开src/example/consts/ViewConst.ts

    添加上我们的关键字:Demo  修改后的的代码为:


  
  
  1. /**
  2. * Created by Administrator on 2014/11/23.
  3. */
  4. enum ViewConst{
  5. Loading = 10000,
  6. Login,
  7. Home,
  8. Friend,
  9. Shop,
  10. Warehouse,
  11. Factory,
  12. Task,
  13. Daily,
  14. Mail,
  15. Demo,
  16. Game = 20000,
  17. GameUI,
  18. RpgGame,
  19. }

2.3 构建DemoController.ts,并绑定之前的ViewConst.Demo

 src/example/module/demo/DemoController.ts :


  
  
  1. /**
  2. * Created by yangsong on 15-1-6.
  3. */
  4. class DemoController extends BaseController{
  5. //private proxy:DemoProxy;
  6. private demoView:DemoView;
  7. public constructor(){
  8. super();
  9. //this.proxy = new DemoProxy(this);
  10. this.demoView = new DemoView( this, LayerManager.UI_Main);
  11. App.ViewManager.register(ViewConst.Demo, this.demoView);
  12. }
  13. }

这是Demo页面的控制器,DemoView负责Demo界面显示,而DemoController负责Demo界面的计算和逻辑

2.4 构建DemoView.ts 以及对应的DemoSkin.exml:

 src/example/module/demo/DemoView.ts:


  
  
  1. /**
  2. * Created by egret on 15-1-6.
  3. */
  4. class DemoView extends BaseEuiView{
  5. public constructor($controller:BaseController, $parent:eui.Group) {
  6. super($controller, $parent);
  7. this.skinName = "resource/skins/DemoSkin.exml";
  8. }
  9. button:eui.Button;
  10. /**
  11. *对面板进行显示初始化,用于子类继承
  12. *
  13. */
  14. public initUI():void{
  15. super.initUI();
  16. this.button.addEventListener(egret.TouchEvent.TOUCH_TAP, this.buttonClickHandler, this);
  17. }
  18. private buttonClickHandler(e:egret.TouchEvent):void{
  19. App.ViewManager.open(ViewConst.Friend);
  20. }
  21. }

resource/skins/DemoSkin.exml:


  
  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <e:Skin class="DemoSkin" width="400" height="300" xmlns:e="http://ns.egret.com/eui" xmlns:w="http://ns.egret.com/wing">
  3. <e:Rect width="361" height="192" x="19" y="52" fillColor="0xebfff8" anchorOffsetX="0" anchorOffsetY="0"/>
  4. <e:Image width="362" height="48" x="19" y="232" anchorOffsetX="0" anchorOffsetY="0" source="table_cloud_top" fillMode="repeat"/>
  5. <e:Image width="362" height="41.99" x="380.89" y="61.99" anchorOffsetX="0" anchorOffsetY="0" source="table_cloud_top" fillMode="repeat" rotation="180.16"/>
  6. <e:Button id="button" label="Button" x="162.5" y="126.5" anchorOffsetX="0" width="74" anchorOffsetY="0" height="75" skinName="MenuButtonSkin"/>
  7. </e:Skin>

2.5 创建DemoTest.ts 用来控制所有和Demo有关的东西:

src/exampltest/Demouyiest.ts:

注意这一行,要加上preload普通资源
var subGroups:Array<string> = ["preload_core", "preload_ui","preload""];


  
  
  1. /**
  2. * Created by yangsong on 15-3-27.
  3. * GUI测试
  4. */
  5. class DemoTest{
  6. public constructor(){
  7. var groupName:string = "preload_DemoTest";
  8. var subGroups: Array<string> = [ "preload_core", "preload_ui", "preload" ];
  9. App.ResourceUtils.loadGroups(groupName, subGroups, this.onResourceLoadComplete, this.onResourceLoadProgress, this);
  10. }
  11. /**
  12. * 资源组加载完成
  13. */
  14. private onResourceLoadComplete():void {
  15. this.initModule();
  16. App.Init();
  17. //音乐音效处理
  18. App.SoundManager.setBgOn(true);
  19. App.SoundManager.setEffectOn(!App.DeviceUtils.IsHtml5 || !App.DeviceUtils.IsMobile);
  20. //App.SceneManager.runScene(SceneConsts.UI);
  21. App.SceneManager.runScene(SceneConsts.Demo);
  22. }
  23. /**
  24. * 资源组加载进度
  25. */
  26. private onResourceLoadProgress(itemsLoaded:number, itemsTotal:number):void {
  27. App.ControllerManager.applyFunc(ControllerConst.Loading, LoadingConst.SetProgress, itemsLoaded, itemsTotal);
  28. }
  29. /**
  30. * 初始化所有模块
  31. */
  32. private initModule():void{
  33. App.ControllerManager.register(ControllerConst.Friend, new FriendController());
  34. App.ControllerManager.register(ControllerConst.Demo, new DemoController());
  35. }
  36. }

2.6 为 DemoController 注册ControllerManager所使用的 ControllerConst.Demo

打开src/example/consts/ControllerConst.ts: 添加上Demo,修改后的代码为:


  
  
  1. /**
  2. * Created by Administrator on 2014/11/23.
  3. */
  4. enum ControllerConst{
  5. Loading = 10000,
  6. Login,
  7. Home,
  8. Friend,
  9. Shop,
  10. Warehouse,
  11. Factory,
  12. Task,
  13. Mail,
  14. Game,
  15. RpgGame,
  16. Demo,
  17. }

2.7 第一步创建DemoScene.ts 注册SceneManager所使用的SceneConsts.Demo

打开src/example/consts/SceneConst.ts: 添加上Demo,修改后的代码为:


  
  
  1. /**
  2. * Created by yangsong on 2014/11/28.
  3. */
  4. enum SceneConsts{
  5. /**
  6. * Game场景
  7. * @type {number}
  8. */
  9. Game = 1,
  10. /**
  11. * 游戏场景
  12. * @type {number}
  13. */
  14. UI,
  15. /**
  16. * Loading场景
  17. * @type {number}
  18. */
  19. LOADING,
  20. /**
  21. * RpgGame场景
  22. * @type {number}
  23. */
  24. RpgGame,
  25. Demo,
  26. }

2.7 打开Main.ts为第一步创建的DemoScene.ts 绑定到 SceneManager

打开Main.ts在private initScene():void 函数中加上一句:

     App.SceneManager.register(SceneConsts.Demo, new DemoScene());

2.8 Main.ts中初始化加载DemoTest

在Main.ts中的private onThemeLoadComplete(): void 函数中的末尾

把其他的new  XXTest();全部注释掉并加上我们的DemoTest:

         new DemoTest();

Main.ts修改后的代码为:


  
  
  1. class Main extends egret.DisplayObjectContainer {
  2. public constructor() {
  3. super();
  4. this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
  5. }
  6. private onAddToStage(event: egret.Event) {
  7. this.removeEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
  8. //注入自定义的素材解析器
  9. egret.registerImplementation( "eui.IAssetAdapter", new AssetAdapter());
  10. egret.registerImplementation( "eui.IThemeAdapter", new ThemeAdapter());
  11. //适配方式(全屏适配)
  12. App.StageUtils.startFullscreenAdaptation( 650, 1000, this.onResize);
  13. //初始化
  14. this.initLifecycle();
  15. this.initScene();
  16. //加载资源配置文件
  17. this.loadResConfig();
  18. }
  19. private initLifecycle(): void {
  20. egret.lifecycle.addLifecycleListener((context) => {
  21. // custom lifecycle plugin
  22. })
  23. egret.lifecycle.onPause = () => {
  24. egret.ticker.pause();
  25. }
  26. egret.lifecycle.onResume = () => {
  27. egret.ticker.resume();
  28. }
  29. }
  30. private onResize(): void {
  31. App.ControllerManager.applyFunc(ControllerConst.RpgGame, RpgGameConst.GameResize);
  32. }
  33. private loadResConfig(): void {
  34. //初始化Resource资源加载库
  35. App.ResourceUtils.addConfig( "resource/default.res.json", "resource/");
  36. App.ResourceUtils.addConfig( "resource/resource_core.json", "resource/");
  37. App.ResourceUtils.addConfig( "resource/resource_ui.json", "resource/");
  38. App.ResourceUtils.addConfig( "resource/resource_battle.json", "resource/");
  39. App.ResourceUtils.addConfig( "resource/resource_rpg.json", "resource/");
  40. App.ResourceUtils.loadConfig( this.onConfigComplete, this);
  41. }
  42. /**
  43. * 配置文件加载完成,开始预加载preload资源组。
  44. */
  45. private onConfigComplete(): void {
  46. //加载皮肤主题配置文件,可以手动修改这个文件。替换默认皮肤。
  47. var theme = new eui.Theme( "resource/default.thm.json", this.stage);
  48. theme.addEventListener(eui.UIEvent.COMPLETE, this.onThemeLoadComplete, this);
  49. }
  50. /**
  51. * 主题文件加载完成
  52. */
  53. private onThemeLoadComplete(): void {
  54. //模块初始化
  55. this.initModule();
  56. //设置加载进度界面
  57. App.SceneManager.runScene(SceneConsts.LOADING);
  58. //开启游戏
  59. //new RpgTest();
  60. //new ActTest();
  61. //new ProtoBufTest();
  62. //new EUITest();
  63. new DemoTest();
  64. }
  65. /**
  66. * 初始化所有场景
  67. */
  68. private initScene(): void {
  69. //App.SceneManager.register(SceneConsts.LOADING, new LoadingScene());
  70. //App.SceneManager.register(SceneConsts.UI, new UIScene());
  71. App.SceneManager.register(SceneConsts.UI, new DemoScene());
  72. App.SceneManager.register(SceneConsts.Game, new GameScene());
  73. App.SceneManager.register(SceneConsts.Demo, new DemoScene()); //rongqingmei
  74. //App.SceneManager.register(SceneConsts.RpgGame, new RpgGameScene());
  75. }
  76. /**
  77. * 初始化所有模块
  78. */
  79. private initModule(): void {
  80. App.ControllerManager.register(ControllerConst.Loading, new LoadingController());
  81. }
  82. }

2.9 运行并显示

  

猜你喜欢

转载自blog.csdn.net/qq_44053474/article/details/100119348