erget项目基本流程入门
本文通过白鹭官方示例程序(一分钟掰弯工厂)为例,初步学习分析一个游戏的基本流程。
1、加载配置:入口文件为Main.ts,创建任何游戏第一都是要创建stage,在stage创建完成后通过json配置加载资源库,并注册配置加载事件监听:
//初始化Resource资源加载库
//initiate Resource loading library
RES.addEventListener(RES.ResourceEvent.CONFIG_COMPLETE, this.onConfigComplete, this);
RES.loadConfig("resource/default.res.json", "resource/");
从以上代码可以看出,所有的资源配置都挂在resource节点下。
2、预加载资源:配置加载完成后开始进行资源预加载,首先移除配置加载的事件监听, 同时增加资源组的加载完成事件、加载过程事件以及加载出错的事件监听。此时通常在这里先加载loading组的资源,(注:通过onResourceProgress回调可以获取资源加载进度)。
/**
* 配置文件加载完成,开始预加载preload资源组。
* configuration file loading is completed, start to pre-load the preload resource group
*/
private onConfigComplete(event:RES.ResourceEvent):void {
RES.removeEventListener(RES.ResourceEvent.CONFIG_COMPLETE, this.onConfigComplete, this);
RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onResourceLoadComplete, this);
RES.addEventListener(RES.ResourceEvent.GROUP_LOAD_ERROR, this.onResourceLoadError, this);
RES.addEventListener(RES.ResourceEvent.GROUP_PROGRESS, this.onResourceProgress, this);
RES.addEventListener(RES.ResourceEvent.ITEM_LOAD_ERROR, this.onItemLoadError, this);
RES.loadGroup("loading");
}
3、资源组加载完成:这时首先完成loading资源组的加载和界面展示,并触发游戏资源组的加载。游戏资源加载完成后移除上一步所有事件监听,创建游戏。
4、游戏状态管理: 在Game类的init中,项目中通过一个StateManager对象对游戏的三个基本阶段进行注册(登录、游戏中、游戏结束),并设置当前状态为登录:
private init():void
{
console.log("this is a new game!");
var stateManager:StateManager = new StateManager(this);
stateManager.registerState("pageInfo", new PageInfo());
stateManager.registerState("pageGame", new PageGame());
stateManager.registerState("pageOver", new PageOver());
stateManager.setCurStateName("pageInfo");
stateManager.startTick();
}
游戏的状态管理在游戏中非常重要,他将游戏划分为几个不同的状态场景,并控制他们之间的相互切换,保证了不同状态之间的相互独立性。我们进一步来分析这个StateManger类。
可以看到“一分钟”项目的src目录中,单独为状态和页面建立了两个文件夹,其中pages非常明确,每个ts对应不同的状态页面。接下来仔细阅读一下state的构成。
StateManager:状态管理类,其中_stateOb实际上是一个状态映射表,StateManager的作用是设置_stateOb,并控制_stateOb的切换;
StateEvent: 事件类,是状态切换监听的自定义事件类;
IState:事件派发类,定义了状态类中会触发的几种事件;
State:状态类,继承egret.DisplayObjectContainer基础类,同时附加IState的接口,对游戏状态及触发的事件进行声明。
ps:关于状态的切换值得注意,代码中在设置了当前状态(setCurState)中添加状态切换的监听事件,同时移除上一个状态的切换监听事件,这样可以保证只有当前状态可以响应状态切换事件。
5、游戏开始:PageInfo.ts和PageOver.ts分别是登录页和游戏结束页,都是普通的图片资源加载,没有过多需要分析的地方,重点是PageGame.ts游戏页。
游戏对象创建时,创建了一个角色管理对象,同时创建了一个角色容器、ui容器、背景角色容器,并获取了音频资源。游戏初始化过程中,主要完成了对角色容器、ui容器、按钮容器三个游戏容器资源的初始化和加载以及背景音乐的播放,并完成了游戏相关的配置(角色队列乱序、等级、难度等);
游戏进行过程中,通过定时器不断触发tick,一方面用于游戏的倒计时,另一方面完成当前游戏状态的刷新。游戏中每一个小人也分为:开始、进行中和结束三个状态。角色乱序队列一次只有10个,没完成一个(即代码中的一个level)后,会触发一次初始化人物队列及UI等的刷新。
6、游戏结束: 通过ScoreManager统一管理游戏中的结果数据。
上一篇: AABB是否和视锥体相交
下一篇: 数据结构和算法:12.二叉搜索树
推荐阅读
-
【教程】ThingJS 3D开发快速入门 第一讲 开发概述·优势·项目流程
-
OpenGL入门详解(3.OpenGL基本流程)
-
VUE从入门到放弃(项目全流程)————VUE
-
在阿里云ECS上部署 Django+MySQL+uWSGI+Nginx 项目的基本流程
-
java项目搭建流程(java入门简单小项目)
-
Python入门05——基本运算符补充,流程控制之if...else
-
vue项目搭建通过vue-cli包括组件路由的使用实现基本的前端项目全流程
-
【教程】ThingJS 3D开发快速入门 第一讲 开发概述·优势·项目流程
-
Scrapy入门:简单爬虫项目梳理整个框架操作流程
-
OpenGL入门详解(3.OpenGL基本流程)