国内游戏引擎使用

内容纲要

开发游戏的引擎有很多,这里简单介绍下比较符合游戏开发流程适合中大型等极其复杂的项目(好像就这俩优点)的引擎 – Layabox。

由于IDE比较难用,官方推荐使用其他编辑器,比如FB/FD/VS/IDEA及子软件。

环境搭建

这里使用Laya IDE演示设计,使用FB开发。

下载地址:

Laya IDE 下载地址:https://ldc2.layabox.com/layadownload/?type=layaairide-LayaAir

Laya Air 下载地址:https://ldc2.layabox.com/layadownload/?type=layaair-LayaAir

Laya native 下载地址:https://ldc2.layabox.com/layadownload/?type=layaairnative

使用其他编辑器,请自行下载安装,按照官网的文档-快速上手配置好就可以了(我就这么说说😏)。

注意:1.官网的文档更新较慢基本无法使用,请自行配置;2.Laya IDE新版本只有设计模式,没有开发编辑模式,如果要使用IDE自带的编辑器,需要下载相关的版本;3.由于之前正式版本的引擎有内存泄漏的bug,这里使用bate版的引擎,禁止项目使用bate版本;

设计游戏

环境配置好后,打开Laya IDE创建一个空项目,勾选相关选项,进入项目后就是设计模式,演示版本的Laya IDE已经移除编辑模式,无法切换编辑模式。

新建项目

打开项目设置(F9),进行项目预览、类库等设置,具体见项目配置文档

项目设置

开始设计游戏:

注意场景切换、类库使用

开发游戏

打开工具路径配置,配置游戏开发的编辑器,就可以开始开发了。

工具路径配置

主文档类

文档类是项目启动调用的类文件,一般以Main命名,可以修改。

打开文档类文件,里面是游戏基础配置,可以加入自定义配置,如背景透明,详见API文档

文档类

package {
    import laya.display.Scene;
    import laya.net.AtlasInfoManager;
    import laya.net.ResourceVersion;
    import laya.net.URL;
    import laya.utils.Handler;
    import laya.utils.Stat;
    import laya.utils.Utils;

    public class Main {
        public function Main() {
            //根据IDE设置初始化引擎      
            if (window["Laya3D"]) window["Laya3D"].init(GameConfig.width, GameConfig.height);
            else Laya.init(GameConfig.width, GameConfig.height, Laya["WebGL"]);
            Laya["Physics"] && Laya["Physics"].enable();
            Laya["DebugPanel"] && Laya["DebugPanel"].enable();
            Laya.stage.scaleMode = GameConfig.scaleMode;
            Laya.stage.screenMode = GameConfig.screenMode;
            Laya.stage.alignV = GameConfig.alignV;
            Laya.stage.alignH = GameConfig.alignH;
            //兼容微信不支持加载scene后缀场景
            URL.exportSceneToJson = GameConfig.exportSceneToJson;

            //打开调试面板(IDE设置调试模式,或者url地址增加debug=true参数,均可打开调试面板)
            if (GameConfig.debug || Utils.getQueryString("debug") == "true") Laya.enableDebugPanel();
            if (GameConfig.physicsDebug && Laya["PhysicsDebugDraw"]) Laya["PhysicsDebugDraw"].enable();
            if (GameConfig.stat) Stat.show();
            Laya.alertGlobalError(true);

            //激活资源版本控制,版本文件由发布功能生成
            ResourceVersion.enable("version.json", Handler.create(this, this.onVersionLoaded), ResourceVersion.FILENAME_VERSION);
        }

        private function onVersionLoaded():void {
            //激活大小图映射,加载小图的时候,如果发现小图在大图合集里面,则优先加载大图合集,而不是小图
            AtlasInfoManager.enable("fileconfig.json", Handler.create(this, this.onConfigLoaded));
        }

        private function onConfigLoaded():void {
            //加载场景
            GameConfig.startScene && Scene.open(GameConfig.startScene);
        }
    }
}

GameConfig文件是项目设置的配置文件,自动生成。

GameConfig

/**This class is automatically generated by LayaAirIDE, please do not make any modifications. */
package {
    import laya.utils.ClassUtils;
    import laya.ui.View;
    import laya.webgl.WebGL;
    /**
     * 游戏初始化配置
     */
    public class GameConfig {
        public static var width:int = 640;
        public static var height:int = 1136;
        public static var scaleMode:String = "fixedwidth";
        public static var screenMode:String = "none";
        public static var alignV:String = "top";
        public static var alignH:String = "left";
        public static var startScene:* = "";
        public static var sceneRoot:String = "";
        public static var debug:Boolean = false;
        public static var stat:Boolean = false;
        public static var physicsDebug:Boolean = false;
        public static var exportSceneToJson:Boolean = true;

        public static function init():void {
            //注册Script或者Runtime引用
            var reg:Function = ClassUtils.regClass;

        }
        GameConfig.init();
    }
}

初始场景

在需要的Scene或View的runtime链接自己的ECMAScript文件就可以生成实例,该实例自动注册和加载,然后就是正常的游戏开发流程(😈)。

对于 [前端开发者] 来说,示例文档和Api文档几乎不用看,都一样,只是引擎有没有实现正常需要的功能,碰到按正常开发出现问题的,直接找官方论坛,基本都是因为引擎没有实现导致。对于 [WEB/HTML5前端开发者] (开发React、Vue、Angular、Jquery、还原设计稿)来说,由于水平参差不齐,可能需要多查找文档和Api。

主场景基本都是要调用其他子场景,除了单例模式要用的属性和方法外,所有方法都是私有的,主场景私有方法可以不遵循代码开发规范,变量名可以直接是public命名方式:

private var _started:Boolean = false;
private var serverInfo:Object = null;
private var scenes:Array = [];
private var time:int = 0;
private var createInterval:uint = 1000;
private var sceneType:int = 1;
private var playType:int = 1;
private var fps:int = 60;
// private var lines:Vector.<Sprite>;

注意,由于Layabox没有实现Single Type的Vector数组,所以只能使用Multiple Type的Array数组,还有很多没有实现,用ECMAScript旧标准替换,尽量使用旧标准。

一般,手游都是多点触控的触摸屏,根据需要是否关闭多点触控:

GameUI.instance = this;//单例
MouseManager.multiTouchEnabled = false;//关闭多点触控

然后重写主场景需要的相关方法:

override public function onEnable():void
{
    this.on(Event.CLICK, this, this.onGameClick);
}

private function onGameClick(e:Event):void{
    e.stopPropagation();
}

根据需要重写其他方法就可以了。

开发模式

一般游戏采用MVC开发方式,这种开发方式是目前较好的开发模式,推荐使用:

public class Model{
    //...
}
public class View{
    //...
}
public class Controll{
    //...
}

开发过程

注意
1. 由于引擎有大量没有实现的功能,比如,Graphics不能设置渐变色,不能设置内阴影,不能设置内模糊等,大量效果需要开发者通过其他方式实现
2. 由于引擎支持其他ECMAScript实现,导致有大内存泄露的Bug,且开发者无解,只能等待官方修复
3. 引擎IDE不好用,想用IDE自带编辑器的需要下载相应版本
4. 引擎的事件流机制与ECMAScript标准有所区别,基本通用
5. 不要在一个Scene中有太多需要重绘的组件
6. 引擎没有加载前的黑/白屏需要开发者通过其他方案解决,比如骨骼屏注入
7. 每次改动完需要重新编译,调试等最好用其他编辑器
8. 缓动实现和效果、动画效果都一样直接用,SP、MC通用,只多了作用域This指向参数

编译和调试游戏

编译和调试根据官方文档配置:

编译和调试游戏

发布游戏

开发完后就是发布了,发布出来的是静态文件,直接放服务器就可以了。

发布游戏

总体来说,使用起来还算方便。

code enjoy! 😄😄😁

作者:indeex

链接:https://indeex.cc

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


发表评论

您的电子邮箱地址不会被公开。