精华内容
下载资源
问答
  • laya发布流程 发布时勾选 是否开启版本管理 发布之后查看 version.json,会发现生成很多键值对,值是资源 +hash字符串 那么laya是怎么映射的呢? 以下是laya底层如何找到映射关系,并让用户无感,无需了解...

    发布流程参考

    laya发布流程

    发布时勾选  是否开启版本管理

    发布之后查看 version.json,会发现生成很多键值对, 值是 资源 + hash字符串

    那么laya是怎么映射的呢?

    以下是laya底层如何找到映射关系,并让用户无感,无需了解也不影响使用

    加载完 version.json后,保存到 ResourceVersion.manifest

    当需要加载一个文件,会从version找到加了hash后的值

    使用ResourceVersion.addVersionPrefix 替换掉 URL.customFormat的方法

    那这个URL.customFormat有什么用呢?

    我们直接看 URL中的源码

    每次 格式化url的时候都会调到 formatURL这个方法,这个方法会处理原始的url,输入真实的url

    这样就实现了通过 version.json来实现版本管理了

    总结:

    加载资源时会去格式化资源url(formatURL),所以流程如下

    1、请求加载资源url

    2、格式化后的url = URL.formatURL(请求的url),这里返回一个version.json映射加了hash字符串的 url

    3、加载映射后的url,请求资源

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • LayaAirIDE中提供了Text、FillText、Label这三种基础的显示文本组件 LayaAir引擎在文本的底层渲染上,有两种方式。 分别是Text文本类的文本统一提交方式,和Graphics类的fillText文本单字符绘制提交方式 ...

    LayaAirIDE中提供了Text、FillText、Label这三种基础的显示文本组件

    LayaAir引擎在文本的底层渲染上,有两种方式。

    分别是Text文本类的文本统一提交方式,和Graphics类的fillText文本单字符绘制提交方式

    如果采用了Text文本,那每一个Text文本对象中的文本字符会一起形成小图集提交到大图合集中,比如游戏中某个文本对象有300字,其中一个字符发生改变,也会对该文本对象的300字整段文本图集重新提到大图合集中。

    采用Graphics类的fillText文本绘制,则是按单个字符向大图合集中进行提交,并且大图合集中已经存在的字符不会重复提交。所以对于图集的利用率比较好,即便是发生文本改变的时候,也不会向Text文本那样,创建很多垃圾图集

    总结:如果文本不需要改变,那按单字提交图集的效率(FillText)是不如一次性直接提交(Text/Label),静态的文本优先使用Text组件,因为只显示静态文本的时候性能最好。动态文本优先使用FillText,除非是国际化等需求不能满足的时候。

     

     

     

     

     

     

     

     

     

    展开全文
  • 总结一下几点 compile.js编译 publish.js发布 ...laya2.2.0\resources\app\out\vs\layaEditor\laya\code\ts\empty 当然在IDE里面编译时会使用IDE自带的node环境和插件,自己项目的编译路径 .laya ...

    编译文件存放位置

    laya项目的编译和发布文件在项目目录的.laya下

    compile.js编译

    publish.js发布

     

    Gulp(通过)

    gulp是基于流的任务化构建工具,读取源文件后在管道中通过一系列插件进行压缩、处理然后输出到目标地址。

     Rollup(打包bundle.js)

    Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,相比gulp更适合打包供调用的lib。

    具体是怎么编译的  看我另一篇文章 ts编译bundle.js

     

     

    展开全文
  • 直接开干源码 Timer的构造函数 /** * 创建 Timer 类的一个实例。 */ constructor(autoActive: boolean = true) { autoActive && Timer.gSysTimer && Timer.gSysTimer.frameLoop(1, this, this._update); } 设置...

    Timer

    laya提供的计时器,有两种方式循环执行代码

    Laya.timer.frameLoop执行频率依赖于帧频率,可通过Stat.FPS查看当前帧频。

    Laya.timer.loop执行频率依赖于参数指定时间。

    直接开干源码

    Timer的构造函数

        /**
         * 创建 <code>Timer</code> 类的一个实例。
         */
        constructor(autoActive: boolean = true) {
            autoActive && Timer.gSysTimer && Timer.gSysTimer.frameLoop(1, this, this._update);
        }

    设置autoActivie可将这个Timer的_update()加入到系统的Timer.gSysTimer.frameLoop(1),从创建的这一刻就开始循环了

    当我们调用了Timer.loop后发生了什么呢?

       /**
         * 定时重复执行。
         * @param	delay	间隔时间(单位毫秒)。
         * @param	caller	执行域(this)。
         * @param	method	定时器回调函数。
         * @param	args	回调参数。
         * @param	coverBefore	是否覆盖之前的延迟执行,默认为 true 。
         * @param	jumpFrame 时钟是否跳帧。基于时间的循环回调,单位时间间隔内,如能执行多次回调,出于性能考虑,引擎默认只执行一次,设置jumpFrame=true后,则回调会连续执行多次
         */
        loop(delay: number, caller: any, method: Function, args: any[] = null, coverBefore: boolean = true, jumpFrame: boolean = false): void {
            var handler: TimerHandler = this._create(false, true, delay, caller, method, args, coverBefore);
            if (handler) handler.jumpFrame = jumpFrame;
        }

    调用loop后,会创建一个TimeHandler,创建完后直接放入_handlers,在_update中循环调用

        /**
         * @internal
         * 帧循环处理函数。
         */
        _update(): void {
            if (this.scale <= 0) {
                this._lastTimer = Date.now();
                this._delta = 0;
                return;
            }
            var frame: number = this.currFrame = this.currFrame + this.scale;
            var now: number = Date.now();
            var awake: boolean = (now - this._lastTimer) > 30000;
            this._delta = (now - this._lastTimer) * this.scale;
            var timer: number = this.currTimer = this.currTimer + this._delta;
            this._lastTimer = now;
    
            //处理handler
            var handlers: any[] = this._handlers;
            this._count = 0;
            for (var i: number = 0, n: number = handlers.length; i < n; i++) {
                var handler: TimerHandler = handlers[i];
                if (handler.method !== null) {
                    var t: number = handler.userFrame ? frame : timer;
                    if (t >= handler.exeTime) {
                        if (handler.repeat) {
                            if (!handler.jumpFrame || awake) {
                                handler.exeTime += handler.delay;
                                handler.run(false);
                                if (t > handler.exeTime) {
                                    //如果执行一次后还能再执行,做跳出处理,如果想用多次执行,需要设置jumpFrame=true
                                    handler.exeTime += Math.ceil((t - handler.exeTime) / handler.delay) * handler.delay;
                                }
                            } else {
                                while (t >= handler.exeTime) {
                                    handler.exeTime += handler.delay;
                                    handler.run(false);
                                }
                            }
                        } else {
                            handler.run(true);
                        }
                    }
                } else {
                    this._count++;
                }
            }
    
            if (this._count > 30 || frame % 200 === 0) this._clearHandlers();
        }

    就这样,没创建一个timer,就加入Timer.gSysTimer.frameLoop(1, this, this._update)中,借用systemTimer的循环带动分timer的_update。

     

    Timer的一些重要参数

        /** 时针缩放。*/
        scale: number = 1;    // 常用来控制timer的流速
        /** 当前帧开始的时间。*/
        currTimer: number = Date.now();    // 用来控制帧渲染,未渲染完的东西放到下一帧
        /** 当前的帧数。*/
        currFrame: number = 0;                
        /**@internal 两帧之间的时间间隔,单位毫秒。*/
        _delta: number = 0;
        /**@internal */
        _lastTimer: number = Date.now();
        /**@private */
        private _map: any[] = [];    // 通过key:handler的方式存储TimerHandler
        /**@private */
        private _handlers: any[] = [];    // 单纯存储handler

    其中_map的key值是通过call.$_GID + method.$_TID组成

    
        /** @private */
        private _indexHandler(handler: TimerHandler): void {
            var caller: any = handler.caller;
            var method: any = handler.method;
            var cid: number = caller ? caller.$_GID || (caller.$_GID = ILaya.Utils.getGID()) : 0;
            var mid: number = method.$_TID || (method.$_TID = (Timer._mid++) * 100000);
            handler.key = cid + mid;
            this._map[handler.key] = handler;
        }

     

     

    展开全文
  • //使用browserify,转换ts到js,并输出到bin/js目录 gulp.task("default", function () { return browserify({ basedir: workSpaceDir, //是否开启调试,开启后会生成jsmap,方便调试ts源码,但会影响编译速度 ...
  • 首先是laya入口函数 /** * 初始化引擎。使用引擎需要先初始化引擎,否则可能会报错。 * @param width 初始化的游戏窗口宽度,又称设计宽度。 * @param height 初始化的游戏窗口高度,又称设计高度。 * @...
  • laya提供4中UI加载模式:内嵌模式,加载模式,分离模式,文件模式(默认) 这些模式的区别就是我的场景UI数据究竟放哪里。 内嵌模式:内嵌模式会把编辑器的UI内容生成一个场景类代码文件,代码脚本里包含IDE创建的UI...
  • import { ui } from "./../ui/layaMaxUI"; // import Rank from "./Rank";...export default class MainGameScript extends Laya.Script{ //#region 属性初始化 private _scene:Laya.Scene3D; private ...
  • laya as3消消乐源码

    2020-07-17 09:57:20
    laya as3消消乐源码 客户端源码 已经实现多个关卡 稍修改一下网络用户数据提交部分即可 实现单机玩
  • Laya追踪效果源码

    2018-10-23 17:07:20
    里面有两个类,一个调用类,一个实体类,实体类实现了追踪效果的具体实现,注释齐全
  • layabox飞机大战源码

    2018-02-05 14:47:33
    基于layabox官方教程的飞机大战源码, 包含游戏素材
  • Laya仿贪吃蛇大战源码

    2019-09-02 12:13:48
    仿照 贪吃蛇大作战 的练手项目,前端时间接触了一下layabox,发现其性能表现确实很强劲,就做了这个贪吃蛇小作战学习使用一下。 layabox性能还不错,示例在手机上通过运行器或打包之后,基本维持在59~60帧(Nexus5, ...
  • Laya2.6.1消灭星星demo源码,ts开发,消灭星星,点击相邻方块消除,点击相邻方块消除,点击相邻方块消除
  • 百度提供站内搜索 京ICP证19004658号 ©1999-2019 北京创新乐知网络技术有限公司 经营性网站备案信息 网络110报警服务 中国互联网举报中心 北京互联网违法和不良信息举报
  • vec4 remapGLPositionZ(vec4 position) { position.z=position.z * 2.0 - position.w; return position;...之前一直好奇laya shader里面remapGLPositionZ这个方法是干嘛用的,今天有空研究了一下源码如上!
  • laya3d版本的捕鱼源码

    2021-02-23 15:43:49
    laya3d版本的捕鱼源码,各种鱼类游动姿态自然,炮弹打击粒子效果华丽,场景变换丰富多彩,为玩家营造了一个生动的海底狩猎场。 微信扫描下方小程序码免费获取 另外需要其他游戏源码的加博主微信,博主给你找,加了...
  • Laya Timer原理 & 源码解析 @author ixenos 2019-03-18 16:26:38 一、原理 1.将所有Handler注册到池中  1.普通Handler在handlers数组中  2.callLatter的Handler在laters数组中 2.然后按定义的执行时刻...
  • 在此之前不是很清楚一般H5引擎是如何实现文本渲染的,正好LayaBox源码就放在那里,不如一起来研究研究是如何实现的。 -正文- 首先文本有两种设置内容的方式,第一种是调用changeText,第二种是直接赋值text属性。...
  • Laya3D 自定义shader + 实时阴影

    千次阅读 2019-10-15 14:59:55
    Laya3D 自定义shader + 实时阴影1 ShaderDefines2 详细步骤1 打开DirectionLight 的投射阴影2 继承BaseMaterial 自定义Material编写3 自定义shader编写 ,参照laya源码里面的blinnPhong Shader4 设置材质,...
  • Laya2.6.1开发消灭星星demo源码 地址:...
  • 之前一直使用LayaBox开发小游戏,其中会修改部分Laya的源代码来适应自己的游戏,但从来没有系统的阅读过LayaBox源代码,既然别人已经开源,那我就索性花空余时间来学习学习这整套的实现方法。 如果一个引擎开源了...
  • Layabox3D游戏视频教程-源码

    千人学习 2019-08-27 23:02:19
    视频教程地址:https://edu.csdn.net/course/detail/25731?pre_view=1 本课程仅提供源码:游戏开发教程链接打开上面链接即可。
  • 上篇博客已经把Laya整个框架梳理了一遍,本编博客我们就开始从Laya的入口学起。 如果我们需要跑起来我们的工程,首先需要将工程编译,Laya默认采用的是Gulp进行编译,配置文件写在了gulpfile.js 如果有同学对于...
  • 我们在正常游戏开发的时候,是无需关系图集的打包过程及Laya是如何解析图集的。只有闲得慌才会去看吧~ -正文- 图集打包过程 Laya是按照文件夹进行图集打包的,每次我们在发布资源的时候就会打包图集。我们只需要...
  • 在阅读laya.webgl.js中的源代码的时候,先来重温下webgl编程方面的知识。 以下内容均为我个人对学习的一个总结,不能完全正确,只是我对于知识的一个理解,如果哪天我发现我理解错了,我会尽快回来修改。 什么是...
  • //u_MvpMatrix mvp矩阵 //a_Position 顶点坐标 vec4 UnityObjectToClipPos() { return gl_Position = u_MvpMatrix * a_Position; }
  • Laya List翻页滚动方案 & List滚动源码解析 @author ixenos 2019-03-29 1.List翻页滚动方案 1 /** 2 * 计算下一页的起始索引, 不足时补足 3 * @param direction 0 for pre, 1 for nex , @author ...
  • 因此我打算首先研究Camera中的一部分代码,以此来研究Laya在3D渲染方面的知识。 本文只去了解Camera在帧渲染过程中做了什么,具体每个细节如何实现,还需要慢慢研究的。 -正文- 摄像机渲染函数做了什么 摄像机...
  • -前言- 习惯2D开发的同学,在转到3D游戏开发的时候,始终会有所不适,首先最难让人不习惯的就是,空间的转换没...我们首先来了解Laya3D有哪些显示对象(3D精灵) Sprite3D作为3D显示对象基类,有三个子类,分...
  • Layabox3D游戏视频教程-源码 有多年Unity程序开发经验,有策划和...

空空如也

空空如也

1 2 3 4
收藏数 63
精华内容 25
关键字:

laya源码