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

 

 
posted @ 2019-11-01 20:18  ixenos  阅读(1921)  评论(0编辑  收藏  举报