zoukankan      html  css  js  c++  java
  • Laya 爆改Laya IDE和Laya引擎使其支持2D粒子爆发模式

    Laya 爆改Laya IDE和Laya引擎使其支持2D粒子爆发模式

    @author ixenos 2019-11-01 19:47:26

    1. 修改IDE的功能需要深入到/resources/app/out/vs/layaEditor路径下

      1)其中,在/resources/app/out/vs/layaEditor/renderer/laya.editorUI.xml可以修改各个属性编辑器的开放属性,就像我们手动写IDE脚本一样,不过这个将会对应所有用到的实例;

     1 <Particle className="laya.editorUI.Particle" icon="Panel" groups="常用,通用,尺寸设置,发射范围,重力模式参数,gravity,半径模式,开始弧度,结束弧度,minStartColor,maxStartColor,minEndColor,maxEndColor,positionVariance" drag="0">
     2         <prop name="burstEnable" tips="是否爆发" type="bool" default="false" group="常用"/>
     3         <prop name="playDuration" tips="总播放时长" type="number" default="2147483647" group="常用"/>
     4 .....
     5 </Particle>

      2)其中,比如粒子编辑器的播放模块就可以在/resources/app/out/vs/layaEditor/h5/renders/particle/editor.max.js进行修改

      3etc.  具体怎么修改IDE,直接用开发者工具进行调试定位功能代码模块

    2.调试2D粒子功能得知,粒子的创建由发射基类EmitterBaseadvanceTime方法负责:

     1   public function advanceTime(passedTime:Number = 1, burstNum:int = 1):void {
     2     _emissionTime -= passedTime;
     3     if (_emissionTime < 0) return;
     4     _frameTime += passedTime;
     5     if (_frameTime < minEmissionTime) return;
     6     while (_frameTime > minEmissionTime) {
     7       _frameTime -= minEmissionTime;
     8       emit();
     9     }
    10   }

    这个方法在一个帧循环中进行,这意味着在限定时间内尽量绘制粒子,那么我们只需要在时间判断中直接输出所有粒子,那就等于在一帧中绘制所有粒子的运动,这就是爆炸效果:

     1   public function advanceTime(passedTime:Number = 1, burstNum:int = 1):void {
     2     _emissionTime -= passedTime;
     3     if (_emissionTime < 0) return;
     4     _frameTime += passedTime;
     5     if (_frameTime < minEmissionTime) return;
     6     while (_frameTime > minEmissionTime) {
     7       for (var i:int = 0; i < burstNum; i++) {
     8         _frameTime -= minEmissionTime;
     9         emit();
    10       }
    11     }
    12   }

    这里开放burstNum参数用于控制爆炸效果(最大值是setting.maxParticles)

    另外在ParticleSetting类中加入我们额外的参数:

     1   public class ParticleSetting {
     2     /**是否爆发*/
     3     public var burstEnable:Boolean = false;
     4     /**播放时长*/
     5     public var playDuration:Number = 2147483647;
     6     ...
     7   }

    同时需要修改粒子载体Particle2D

     1         /**
     2          * 设置粒子配置数据
     3          * @param settings 粒子配置数据
     4          */
     5         public function setParticleSetting(setting:ParticleSetting):void {
     6             _setting = setting;
     7 
     8                     ...
     9 
    10             if (autoPlay) {
    11                 start();//这里将emitter.start()修改为我们自己封装的start()
    12                 play();
    13             }
    14         }        
    1         public function start():void {
    2             if(emitter){
    3                 if(_setting && _setting.playDuration>0){
    4                     emitter.start(_setting.playDuration);//同时我们也让IDE支持控制总播放时长
    5                 }else{
    6                     emitter.start();
    7                 }
    8             }
    9         }
     1         /**
     2          * 时钟前进
     3          * @param passedTime 时钟前进时间
     4          */
     5         public function advanceTime(passedTime:Number = 1):void {
     6             if (_canvasTemplate) {
     7                 _canvasTemplate.advanceTime(passedTime);
     8             }
     9             if (_emitter) {
    10                 if(_setting && _setting.burstEnable){
    11                     _emitter.advanceTime(passedTime, _setting.maxPartices);//这里传入maxPartices表示在一帧中全部开始绘制
    12                 }else{
    13                     _emitter.advanceTime(passedTime);
    14                 }
    15             }
    16         }

    3.最终效果:

    这些数值最终导出到配置文件.part中(实质是JSON)

     

     4.在这个过程中有个曲折的地方就是,我想按官方的脚本方法来该IDE的属性面板,结果粒子的属性面板用脚本改不了,我以为没有办法了,就转而用Laya编写一个粒子编辑器,配合FileSaver.js将配置文件再保存出来,

    最后再翻看的时候发现了可以直接爆改IDE。All Right! 条条大路通罗马。。。

    附上这个粒子编辑器的地址:https://github.com/ixenos/laya-particle-editor

     
  • 相关阅读:
    PHP_Code_challenge(代码审计)
    超全局变量$GLOBALS
    upload-labs(文件上传)
    CTF bugku 论剑场 web20
    多次Printf()是否使用用同一栈帧的参数?
    (转载于度盘)小迪安全渗透-学习讲义
    SQL数据库操作练习(2)
    .htaccess绕过
    PHP序列化思考(9.14已修改)
    SQL数据库操作练习(1)
  • 原文地址:https://www.cnblogs.com/ixenos/p/11779312.html
Copyright © 2011-2022 走看看