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脚本一样,不过这个将会对应所有用到的实例;
<Particle className="laya.editorUI.Particle" icon="Panel" groups="常用,通用,尺寸设置,发射范围,重力模式参数,gravity,半径模式,开始弧度,结束弧度,minStartColor,maxStartColor,minEndColor,maxEndColor,positionVariance" drag="0">
<prop name="burstEnable" tips="是否爆发" type="bool" default="false" group="常用"/>
<prop name="playDuration" tips="总播放时长" type="number" default="2147483647" group="常用"/>
.....
</Particle>
2)其中,比如粒子编辑器的播放模块就可以在/resources/app/out/vs/layaEditor/h5/renders/particle/editor.max.js进行修改
3)etc. 具体怎么修改IDE,直接用开发者工具进行调试定位功能代码模块
2.调试2D粒子功能得知,粒子的创建由发射基类EmitterBase的advanceTime方法负责:
public function advanceTime(passedTime:Number = 1, burstNum:int = 1):void {
_emissionTime -= passedTime;
if (_emissionTime < 0) return;
_frameTime += passedTime;
if (_frameTime < minEmissionTime) return;
while (_frameTime > minEmissionTime) {
_frameTime -= minEmissionTime;
8 emit();
}
}
这个方法在一个帧循环中进行,这意味着在限定时间内尽量绘制粒子,那么我们只需要在时间判断中直接输出所有粒子,那就等于在一帧中绘制所有粒子的运动,这就是爆炸效果:
public function advanceTime(passedTime:Number = 1, burstNum:int = 1):void {
_emissionTime -= passedTime;
if (_emissionTime < 0) return;
_frameTime += passedTime;
if (_frameTime < minEmissionTime) return;
while (_frameTime > minEmissionTime) {
for (var i:int = 0; i < burstNum; i++) {
_frameTime -= minEmissionTime;
9 emit();
}
}
}
这里开放burstNum参数用于控制爆炸效果(最大值是setting.maxParticles)
另外在ParticleSetting类中加入我们额外的参数:
public class ParticleSetting {
/**是否爆发*/
public var burstEnable:Boolean = false;
/**播放时长*/
public var playDuration:Number = 2147483647;
...
}
同时需要修改粒子载体Particle2D:
/**
* 设置粒子配置数据
* @param settings 粒子配置数据
*/
public function setParticleSetting(setting:ParticleSetting):void {
_setting = setting; ... if (autoPlay) {
start();//这里将emitter.start()修改为我们自己封装的start()
play();
}
}
public function start():void {
if(emitter){
if(_setting && _setting.playDuration>0){
emitter.start(_setting.playDuration);//同时我们也让IDE支持控制总播放时长
}else{
emitter.start();
}
}
}
/**
* 时钟前进
* @param passedTime 时钟前进时间
*/
public function advanceTime(passedTime:Number = 1):void {
if (_canvasTemplate) {
_canvasTemplate.advanceTime(passedTime);
}
if (_emitter) {
if(_setting && _setting.burstEnable){
_emitter.advanceTime(passedTime, _setting.maxPartices);//这里传入maxPartices表示在一帧中全部开始绘制
}else{
_emitter.advanceTime(passedTime);
}
}
}
3.最终效果:

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

4.在这个过程中有个曲折的地方就是,我想按官方的脚本方法来该IDE的属性面板,结果粒子的属性面板用脚本改不了,我以为没有办法了,就转而用Laya编写一个粒子编辑器,配合FileSaver.js将配置文件再保存出来,
最后再翻看的时候发现了可以直接爆改IDE。All Right! 条条大路通罗马。。。
附上这个粒子编辑器的地址:https://github.com/ixenos/laya-particle-editor
Laya 爆改Laya IDE和Laya引擎使其支持2D粒子爆发模式的更多相关文章
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇:简介及目录》(附上完整工程文件)
G-3D引擎2D射击类游戏制作教程 游戏类型: 打飞机游戏属于射击类游戏中的一种,可以划分为卷轴射击类游戏. 视觉表现类型为:2D 框架简介: Genesis-3D引擎不仅为开发者提供一个3D游戏制作 ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇01:播放序列动画》
1.播放序列动画 系列动画播放概述 2D游戏中的动画系统,不同于3D游戏.3D游戏中,角色美术资源不仅包含角色模型的,还包括角色的贴图和动作等,模型本身自带角色的动作动画效果.2D游戏中,角色美术资源 ...
- 【转载】从零实现3D图像引擎:(2)画2D直线不简单
原文:从零实现3D图像引擎:(2)画2D直线不简单 1. 数学分析 1) 画直线的问题 本来我以为画直线会很容易,随便拿个直线公式,遍历X求Y画出来不就完了么,但事实并非如此.以2D直线为例,因为3D ...
- Laya一个莫名其妙的报错laya.pathfinding
版本2.2.0 莫名其妙,然后论坛查了下 把类库设置,不勾选这玩意就不报错了.
- 【learning】vim爆改记 (如何让vim用起来像devc++)
由于本蒟蒻NOIP人品大爆发,能去冬令营,故准备开始练习使用linux下的IDE:vim 在dalao DTZ的帮助下,我装好了vim,并做了最初的配置. 然而........好难用啊,怎么和devc ...
- 查看MySQL是否支持InnoDB引擎以及不支持的解决办法
通过命令行进入mysql SHOW variables like "have_%"; 显示结果中会有如下3种可能的结果: have_innodb YES have_innodb N ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇08:弹幕系统》本系列完结
8.弹幕系统 弹幕系统概述: 弹幕系统的设计体现了射击游戏的基本要素,玩家要在敌人放出的大量子弹(弹幕)的细小空隙间闪避,能在玩家闪躲弹幕的时候给玩家带来快感,接近满屏的子弹,增加了对玩家的视觉冲击力 ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇07:全屏炸弹》
7.全屏炸弹 全屏炸弹概述: 为了增设游戏的趣味性,我们制作一个游戏的基本框架以外.还会增设一些其他的额外的功能.比如5秒无敌状态.冰冻效果等.下面咱们以消灭屏幕中所有炸弹为例,看除了碰撞可以触发事件 ...
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇06:计分》
6.计分 计分概述: 分值计量直接反应玩家在游戏中获得的成就感.因此,计分系统在游戏中显得尤为重要,有的反应在直接获取的分数上,有的反应在杀敌数量上等. 计分原理: 原理图,如图6-1所示. 图6-1 ...
随机推荐
- Intellij Idea使用教程汇总篇
Java编程强大的工具IDEA使用教程及一些快捷键收藏如下: https://blog.csdn.net/fanrenxiang/article/details/80503490
- 学习kettle遇到的问题
一. 解决mysql连接缺少驱动问题:http://www.mamicode.com/info-detail-1724584.html 1.下载驱动 https://dev.mysql.com/dow ...
- ELK7.4.0分析nginx json日志
ELK7.4.0单节点部署 环境准备 安装系统,数据盘设置为/srv 内核优化参考 我们需要创建elk专用的账号,并创建所需要的目录并授权 useradd elk; mkdir /srv/{app,d ...
- get与post请求的区别 (面试会问)
get和post请求是HTTP与服务器交互方式,也就是通常所说的风别对服务器资源的增删改查 1. post是修改数据 get是获得数据 GET在浏览器回退时是无害的,而POST会再次提交请求.(面 ...
- linux中防止黑客进入单用户模式进行强制修改密码窃取数据
如何防止别人恶意通过单用户系统破解root密码,进入系统窃取数据? 给grub加密,不让别人通过grub进入单用户. 当前系统:CentOS Linux release 7.6.1810 (Core) ...
- 自己写一个Layout
1 Layout是ViewGroup的子类 LinearLayout.FrameLayout都是ViewGroup的子类,自己写的Layout也是ViewGroup的子类. 2 步骤 第一,自己的La ...
- 安装配置php及fastadmin
FastAdmin教程之准备运行环境 一.Node.js http://nodejs.cn/download/ https://npm.taobao.org/mirrors/node/v8.4.0 ...
- PyCharm中运行同一个python程序时选择平行窗口运行
问题描述 当我们进行Socket编程时,客户端可能有多个,原则上如果有n个客户端,那么我们就要编辑n客户端的代码.然而其实我们每个客户端的代码都是相同,如果编辑n遍,将会相当的浪费空间. 解决办法 学 ...
- HNUSTOJ-1565 Vampire Numbers(暴力打表)
1565: Vampire Numbers 时间限制: 3 Sec 内存限制: 128 MB提交: 20 解决: 9[提交][状态][讨论版] 题目描述 The number 1827 is an ...
- 微信小程序获得微信头像和昵称
微信小程序之登录态的探索 { wx.getSetting({ success: res => { if (res.authSetting && res.authSetting[' ...