笔记一 通用框架的入门操作:制造一个基本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:
/**
* Created by yangsong on 2014/11/28.
* UI场景层
*/
class DemoScene extends BaseScene {
/**
* 构造函数
*/
public constructor() {
super();
}
/**
* 进入Scene调用
*/
public onEnter(): void {
super.onEnter();
//添加该Scene使用的层级
this.addLayer(LayerManager.UI_Main);
this.addLayer(LayerManager.UI_Popup);
this.addLayer(LayerManager.UI_Message);
this.addLayer(LayerManager.UI_Tips);
//添加一个纯色背景
var rect: eui.Rect = new eui.Rect();
rect.fillColor = 0x78b93f;
rect.percentHeight = 100;
rect.percentWidth = 100;
LayerManager.UI_Main.addChild(rect);
//初始打开Home页面
App.ViewManager.open(ViewConst.Demo);
}
/**
* 退出Scene调用
*/
public onExit(): void {
super.onExit();
}
}
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 修改后的的代码为:
/**
* Created by Administrator on 2014/11/23.
*/
enum ViewConst{
Loading = 10000,
Login,
Home,
Friend,
Shop,
Warehouse,
Factory,
Task,
Daily,
Mail,
Demo,
Game = 20000,
GameUI,
RpgGame,
}
2.3 构建DemoController.ts,并绑定之前的ViewConst.Demo
src/example/module/demo/DemoController.ts :
/**
* Created by yangsong on 15-1-6.
*/
class DemoController extends BaseController{
//private proxy:DemoProxy;
private demoView:DemoView;
public constructor(){
super();
//this.proxy = new DemoProxy(this);
this.demoView = new DemoView(this, LayerManager.UI_Main);
App.ViewManager.register(ViewConst.Demo, this.demoView);
}
}
这是Demo页面的控制器,DemoView负责Demo界面显示,而DemoController负责Demo界面的计算和逻辑
2.4 构建DemoView.ts 以及对应的DemoSkin.exml:
src/example/module/demo/DemoView.ts:
/**
* Created by egret on 15-1-6.
*/
class DemoView extends BaseEuiView{
public constructor($controller:BaseController, $parent:eui.Group) {
super($controller, $parent);
this.skinName = "resource/skins/DemoSkin.exml";
}
button:eui.Button;
/**
*对面板进行显示初始化,用于子类继承
*
*/
public initUI():void{
super.initUI();
this.button.addEventListener(egret.TouchEvent.TOUCH_TAP,this.buttonClickHandler,this);
}
private buttonClickHandler(e:egret.TouchEvent):void{
App.ViewManager.open(ViewConst.Friend);
}
}
resource/skins/DemoSkin.exml:
2.5 创建DemoTest.ts 用来控制所有和Demo有关的东西:
src/exampltest/Demouyiest.ts:
注意这一行,要加上preload普通资源
var subGroups:Array
/**
* Created by yangsong on 15-3-27.
* GUI测试
*/
class DemoTest{
public constructor(){
var groupName:string = "preload_DemoTest";
var subGroups:Array = ["preload_core", "preload_ui","preload""];
App.ResourceUtils.loadGroups(groupName, subGroups, this.onResourceLoadComplete, this.onResourceLoadProgress, this);
}
/**
* 资源组加载完成
*/
private onResourceLoadComplete():void {
this.initModule();
App.Init();
//音乐音效处理
App.SoundManager.setBgOn(true);
App.SoundManager.setEffectOn(!App.DeviceUtils.IsHtml5 || !App.DeviceUtils.IsMobile);
//App.SceneManager.runScene(SceneConsts.UI);
App.SceneManager.runScene(SceneConsts.Demo);
}
/**
* 资源组加载进度
*/
private onResourceLoadProgress(itemsLoaded:number, itemsTotal:number):void {
App.ControllerManager.applyFunc(ControllerConst.Loading, LoadingConst.SetProgress, itemsLoaded, itemsTotal);
}
/**
* 初始化所有模块
*/
private initModule():void{
App.ControllerManager.register(ControllerConst.Friend, new FriendController());
App.ControllerManager.register(ControllerConst.Demo, new DemoController());
}
}
2.6 为 DemoController 注册ControllerManager所使用的 ControllerConst.Demo:
打开src/example/consts/ControllerConst.ts: 添加上Demo,修改后的代码为:
/**
* Created by Administrator on 2014/11/23.
*/
enum ControllerConst{
Loading = 10000,
Login,
Home,
Friend,
Shop,
Warehouse,
Factory,
Task,
Mail,
Game,
RpgGame,
Demo,
}
2.7 为第一步创建DemoScene.ts 注册SceneManager所使用的SceneConsts.Demo:
打开src/example/consts/SceneConst.ts: 添加上Demo,修改后的代码为:
/**
* Created by yangsong on 2014/11/28.
*/
enum SceneConsts{
/**
* Game场景
* @type {number}
*/
Game = 1,
/**
* 游戏场景
* @type {number}
*/
UI,
/**
* Loading场景
* @type {number}
*/
LOADING,
/**
* RpgGame场景
* @type {number}
*/
RpgGame,
Demo,
}
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修改后的代码为:
class Main extends egret.DisplayObjectContainer {
public constructor() {
super();
this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
}
private onAddToStage(event: egret.Event) {
this.removeEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
//注入自定义的素材解析器
egret.registerImplementation("eui.IAssetAdapter", new AssetAdapter());
egret.registerImplementation("eui.IThemeAdapter", new ThemeAdapter());
//适配方式(全屏适配)
App.StageUtils.startFullscreenAdaptation(650, 1000, this.onResize);
//初始化
this.initLifecycle();
this.initScene();
//加载资源配置文件
this.loadResConfig();
}
private initLifecycle(): void {
egret.lifecycle.addLifecycleListener((context) => {
// custom lifecycle plugin
})
egret.lifecycle.onPause = () => {
egret.ticker.pause();
}
egret.lifecycle.onResume = () => {
egret.ticker.resume();
}
}
private onResize(): void {
App.ControllerManager.applyFunc(ControllerConst.RpgGame, RpgGameConst.GameResize);
}
private loadResConfig(): void {
//初始化Resource资源加载库
App.ResourceUtils.addConfig("resource/default.res.json", "resource/");
App.ResourceUtils.addConfig("resource/resource_core.json", "resource/");
App.ResourceUtils.addConfig("resource/resource_ui.json", "resource/");
App.ResourceUtils.addConfig("resource/resource_battle.json", "resource/");
App.ResourceUtils.addConfig("resource/resource_rpg.json", "resource/");
App.ResourceUtils.loadConfig(this.onConfigComplete, this);
}
/**
* 配置文件加载完成,开始预加载preload资源组。
*/
private onConfigComplete(): void {
//加载皮肤主题配置文件,可以手动修改这个文件。替换默认皮肤。
var theme = new eui.Theme("resource/default.thm.json", this.stage);
theme.addEventListener(eui.UIEvent.COMPLETE, this.onThemeLoadComplete, this);
}
/**
* 主题文件加载完成
*/
private onThemeLoadComplete(): void {
//模块初始化
this.initModule();
//设置加载进度界面
App.SceneManager.runScene(SceneConsts.LOADING);
//开启游戏
//new RpgTest();
//new ActTest();
//new ProtoBufTest();
//new EUITest();
new DemoTest();
}
/**
* 初始化所有场景
*/
private initScene(): void {
//App.SceneManager.register(SceneConsts.LOADING, new LoadingScene());
//App.SceneManager.register(SceneConsts.UI, new UIScene());
App.SceneManager.register(SceneConsts.UI, new DemoScene());
App.SceneManager.register(SceneConsts.Game, new GameScene());
App.SceneManager.register(SceneConsts.Demo, new DemoScene()); //rongqingmei
//App.SceneManager.register(SceneConsts.RpgGame, new RpgGameScene());
}
/**
* 初始化所有模块
*/
private initModule(): void {
App.ControllerManager.register(ControllerConst.Loading, new LoadingController());
}
}
2.9 运行并显示