欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

erget项目基本流程入门

程序员文章站 2022-03-13 13:48:28
...

       本文通过白鹭官方示例程序(一分钟掰弯工厂)为例,初步学习分析一个游戏的基本流程。

       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统一管理游戏中的结果数据。