pastime/js/plugins/TRP_ParticleMZ_SubEmitter.js
2026-03-15 16:45:22 -05:00

844 lines
No EOL
30 KiB
JavaScript

//=============================================================================
// TRP_ParticleMZ_SubEmitter.js
//=============================================================================
/* このソフトウェアは正規に購入したユーザーのみが利用規約に従って使用することができます。
また、このソフトウェアはMITライセンス、ならびにApache 2.0ライセンスで配布されている製作物が含まれています。
http://www.opensource.org/licenses/mit-license
http://www.apache.org/licenses/LICENSE-2.0
*/
//=============================================================================
/*:
* @target MZ
* @plugindesc サブエミッター機能の有効化
* @author Thirop
* @base TRP_ParticleMZ
* @orderAfter TRP_ParticleMZ
* @help
* 【更新履歴】
* 1.21 2022/05/02 制御文字が反映されない不具合の修正
* 1.13 2021/10/27 慣性が正しく働かない不具合修正
* 1.09 2021/08/18 本体設定「キャッシュ設定(β)」に対応
* 1.08 2021/06/30 Safari/iOSで生じる起動時エラー修正
* 1.00 2021/04/10 初版。
*
* @command set
* @text set/サブエミッターのセット
* @desc サブエミッターをセット(親エミッターの再生直後に実行すること)
*
* @arg id
* @text 親エミッターID
* @desc 対象とする(再生中の)親エミッターID
*
* @arg name
* @text 設定名
* @desc サブエミッターとして再生する設定名
*
* @arg timing
* @text 開始タイミング
* @desc 射出を開始するタイミング(0~1)
* @default 0
*
* @arg endTiming
* @text 終了タイミング
* @desc 射出を終了するタイミング(0~1)、-1で無効。emitterLifetimeか早いほうが優先。
* @default -1
*
* @arg speedRate
* @text 慣性速度
* @desc 慣性の影響度合い(0~1で0%~100%)
* @default 0
*
* @arg inheritAngle
* @text 角度の継承
* @desc 角度の継承モード。0で親パーティクルの角度の影響なし、1で影響あり。
* @default 0
*
* @arg inheritScale
* @text 拡大率乗数の継承
* @desc 拡大率乗数の継承モード。0で親パーティクルのminimumScaleMultiplierの影響なし、1で影響あり。
* @default 0
*
* @arg delay
* @text _ディレイ
* @desc 1以上とすると、指定フレーム後にコマンドを実効。
* @default 0
* @type number
* @min 0
*
*/
//=============================================================================
//PRAGMA_END: subEmitterHeader
//PRAGMA: englishHeader
//PRAGMA_END: englishHeader
(function(){
'use strict';
//PRAGMA: subEmitterRegisterCommands
(()=>{
var pluginName = 'TRP_ParticleMZ_SubEmitter';
var command = 'set';
PluginManager.registerCommand(pluginName, command, function(args){
//this > interpreter
var argsArr = Object.values(args)
var delay = Number(argsArr.pop())||0;
var pCommand = command;
argsArr.unshift(pCommand);
argsArr.unshift('sub');
var eventId = this.eventId();
if(delay>0){
$gameScreen._particle.reservePluginCommand(delay,this,argsArr,eventId);
}else{
$gameScreen._particle.pluginCommand(this,argsArr,eventId);
}
});
})();
//PRAGMA_END: subEmitterRegisterCommands
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function(d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
/***************************************************************************** */
//PRAGMA: subEmitterPluginSetting
var baseParameters = PluginManager.parameters('TRP_ParticleMZ');
//PRAGMA_END: subEmitterPluginSetting
var LC = TRP_Localize.localize.bind(TRP_Localize,'parSe');
var _Game_Particle_particleData= Game_Particle.prototype.particleData;
Game_Particle.prototype.particleData = function(eventId,id,target,name,z,x,y,image){
var data = _Game_Particle_particleData.apply(this,arguments);
if(data.subs){
data.subs = null;
}
return data;
};
var _Game_Particle_pluginCommand= Game_Particle.prototype.pluginCommand;
Game_Particle.prototype.pluginCommand = function(interpreter,args,eventId){
var sub = args[0].toLowerCase();
if(sub === 'sub'){
this.processSubEmitterCommand(interpreter,args,eventId);
}else{
_Game_Particle_pluginCommand.call(this,interpreter,args,eventId);
}
};
Game_Particle.prototype.processSubEmitterCommand = function(interpreter,args,eventId){
this.convertEscapeCharacters(args);
var main = args.shift();
var sub = args.shift().toLowerCase();
if(!isNaN(eventId)){
this.processArgsEventId(args,eventId);
}
if(sub==='set'||sub==='play'||sub==='edit'){
if(sub==='set'||sub==='play'){
Game_Particle.prototype.particleSubEmitterSet.apply(this,args);
}else if(sub==='edit'){
if(Game_Particle.prototype.particleSubEmitterEdit.apply(this,args) && interpreter){
interpreter.wait(1);
}
}
}
};
Game_Particle.prototype.particleSubEmitterSet = function(id,name,timing=0,endTiming=-1,speedRate=0,inheritAngle=0, inheritScale=0){
var data = this.dataWithId(id);
if(!data){
return;
}
var subEmitters = data.subs;
if(!subEmitters){
subEmitters = data.subs = [];
}
var length = subEmitters.length;
for(var i=0; i<length; i=(i+1)|0){
var sb = subEmitters[i];
if(sb[0]===name){
return;
}
}
subEmitters.push([name,Number(timing),Number(endTiming),Number(speedRate),Number(inheritAngle),Number(inheritScale)]);
};
Game_Particle.SUB_EMITTER_DEFAULT_DATA = null;
Game_Particle.prototype.particleSubEmitterEdit = function(id,name,timing=0,endTiming=-1,speedRate=0,inheritAngle=0, inheritScale=0){
//ensure config data exists
if(!$dataTrpParticles[name] && !$dataTrpParticlePreset[name]){
if(!Game_Particle.SUB_EMITTER_DEFAULT_DATA){
Game_Particle.SUB_EMITTER_DEFAULT_DATA = JsonEx.makeDeepCopy(ParticleEditor.DEFAULT_DATA||{});
Game_Particle.SUB_EMITTER_DEFAULT_DATA.frequency = 0.1;
}
$dataTrpParticles[name] = JsonEx.makeDeepCopy(Game_Particle.SUB_EMITTER_DEFAULT_DATA);
}
this.particleSubEmitterSet.apply(this,arguments);
id = id+Game_Particle.SUB_EMITTER_DEV_SUFFIX+name;
var exData = {
timing:timing,
endTiming:endTiming,
speedRate:speedRate,
inheritAngle:inheritAngle,
inheritScale:inheritScale,
}
this._particleEditWithExData(exData,0,'',id);
};
Game_Particle.SUB_EMITTER_DEV_SUFFIX = '/SUB:';
var _Game_Particle_idWithSuffix = Game_Particle.prototype.idWithSuffix;
Game_Particle.prototype.idWithSuffix = function(id){
if(this._suffix && id.contains(Game_Particle.SUB_EMITTER_DEV_SUFFIX)){
var args = id.split(Game_Particle.SUB_EMITTER_DEV_SUFFIX);
var main = args[0];
var sub = args[1];
main = _Game_Particle_idWithSuffix.call(this,main);
return main + Game_Particle.SUB_EMITTER_DEV_SUFFIX + sub;
}else{
return _Game_Particle_idWithSuffix.call(this,id);
}
};
//=============================================================================
// ParticleEmitter
//=============================================================================
var _ParticleEmitter_setupBitmaps = ParticleEmitter.prototype.setupBitmaps;
ParticleEmitter.prototype.setupBitmaps = function(image,bitmaps){
_ParticleEmitter_setupBitmaps.call(this,image,bitmaps);
this._setupSubEmitterBitmaps = true;
if(this._data.subs){
this.setupSubEmitters(image,bitmaps,this._data.subs);
}else{
this.tryStart(image,bitmaps);
}
};
var _ParticleEmitter_initMembers = ParticleEmitter.prototype.initMembers;
ParticleEmitter.prototype.initMembers = function(){
_ParticleEmitter_initMembers.call(this);
this._setupSubEmitterBitmaps = false;
this._subData = null;
this._subNames = null;
this._subBitmaps = null;
};
ParticleEmitter.prototype.setupSubEmitters = function(image,mainBitmaps,subData){
this._subData = subData;
this._subNames = [];
var bitmaps = this._subBitmaps = [];
var length = subData.length;
for(var i=0; i<length; i=(i+1)|0){
var data = subData[i];
var name = data[0];
var config = Game_Particle.configDataWithName(name)
Array.prototype.push.apply(bitmaps,this.bitmapsWithImage(config.image||baseParameters.defaultImage));
this._subNames.push(name);
}
var length = bitmaps.length;
for(var i = 0; i<length; i=(i+1)|0){
bitmaps[i].addLoadListener(ParticleEmitter.prototype.tryStart.bind(this,image,mainBitmaps));
}
};
var _ParticleEmitter_tryStart = ParticleEmitter.prototype.tryStart;
ParticleEmitter.prototype.tryStart = function(image,bitmaps){
if(this._started)return;
if(!this._setupSubEmitterBitmaps){
return;
}
if(this._subBitmaps){
for(const bitmap of this._subBitmaps){
if(!bitmap.isReady()){
return false;
}
}
this._subBitmaps = null;
}
return _ParticleEmitter_tryStart.call(this,image,bitmaps);
};
var _ParticleEmitter_start = ParticleEmitter.prototype.start;
ParticleEmitter.prototype.start = function(image,bitmaps){
_ParticleEmitter_start.call(this,image,bitmaps);
if(this._subData){
var emitter = this._emitter;
var container = this._container;
for(const data of this._subData){
this.setSubEmitter(emitter,container,data);
}
}
};
ParticleEmitter.prototype.setSubEmitter = function(emitter,container,data){
var name = data[0];
var timing = data[1]||0;
var endTiming = data.length>=3 ? data[2]||0 : -1;
var speedRate = data[3]||0;
var inheritAngle = data[4]||0;
var inheritScale = data[5]||0;
var config = Game_Particle.configDataWithName(name);
var image = config.image||baseParameters.defaultImage;
var bitmaps = this.bitmapsWithImage(image);
var textures = this._texturesWithBitmaps(image,bitmaps);
emitter.setSubEmitter(container,textures,config,timing,endTiming,speedRate,inheritAngle,inheritScale);
};
ParticleEmitter.prototype.particleConstructor = function(){
return this._subData ? TRP_ParticleEx : TRP_Particle;
};
ParticleEmitter.prototype.emitterConstructor = function(){
return this._subData ? TRP_EmitterEx : TRP_Emitter;
};
ParticleEmitter.prototype.subEmitter = function(name){
return this._emitter._subEmitters ? this._emitter._subEmitters[this._subNames.indexOf(name)] : null;
};
var _ParticleEmitter_loopParticles = ParticleEmitter.prototype.loopParticles;
ParticleEmitter.prototype.loopParticles = function(loopX,loopY){
_ParticleEmitter_loopParticles.call(this,loopX,loopY,this._emitter);
if(this._subEmitters){
var length = this._subEmitters.length;
for(var i=0; i<length; i=(i+1)|0){
_ParticleEmitter_loopParticles.call(this,loopX,loopY,this._subEmitters[i]);
}
}
};
var _ParticleEmitter_cleanup = ParticleEmitter.prototype.cleanup;
ParticleEmitter.prototype.cleanup = function(){
_ParticleEmitter_cleanup.call(this);
if(this._emitter instanceof TRP_EmitterEx){
this._emitter.cleanupSubEmitters();
}
};
//=============================================================================
// TRP_EmitterEx
//=============================================================================
var TRP_Emitter = ParticleEmitter.TRP_Emitter;
var Emitter = PIXI.particles.Emitter;
var TRP_EmitterEx = /** @class */(function(_super){
__extends(TRP_EmitterEx,_super);
var utils = PIXI.particles.ParticleUtils;
function TRP_EmitterEx(particleParent, particleImages, config){
var _this = _super.call(this, particleParent, particleImages, config)||this;
_this._subEmitters = [];
return _this;
};
TRP_EmitterEx.prototype.destroy = function(force){
if(!force && this.particleTotalCount()>0)return;
_super.prototype.destroy.call(this);
var length = this._subEmitters.length;
for(var i=0; i<length; i=(i+1)|0){
this._subEmitters[i].destroy();
}
this._subEmitters.length = 0;
};
TRP_EmitterEx.prototype.cleanupSubEmitters = function(){
var length = this._subEmitters.length;
for(var i=0; i<length; i=(i+1)|0){
var sub = this._subEmitters[i];
sub.cleanup();
}
}
TRP_EmitterEx.prototype.particleTotalCount = function(){
var count = this.particleCount;
var length = this._subEmitters.length;
for(var i=0; i<length; i=(i+1)|0){
count += this._subEmitters[i].particleCount;
}
return count;
};
TRP_EmitterEx.prototype.update = function (delta) {
_super.prototype.update.call(this,delta);
if(!this._parent)return;
if(this._subEmitters){
var length = this._subEmitters.length;
for(var i=0; i<length; i=(i+1)|0){
this._subEmitters[i].update(delta);
}
}
};
TRP_EmitterEx.prototype.setSubEmitter = function(container,textures,config,timing,endTiming,speedRate,inheritAngle,inheritScale){
var emitter = new TRP_SubEmitter(container,textures,config,timing,endTiming,speedRate,inheritAngle,inheritScale);
this._subEmitters.push(emitter);
};
TRP_EmitterEx.prototype.applyAdditionalProperties = function (p) {
TRP_Emitter.prototype.applyAdditionalProperties.call(this,p);
p.subEmitters = this._subEmitters;
if(p.subEmitters){
var emitters = p.subEmitters;
var length = emitters.length;
for(var i=0; i<length; i=(i+1)|0){
this.pushSubEmitterData(p,i);
}
}
};
TRP_EmitterEx.prototype.pushSubEmitterData = function(p,i){
var data = p.subEmitterData[i];
if(!data){
data = {};
p.subEmitterData[i] = data;
data._prevEmitterPos = new PIXI.Point(p.x,p.y);
}else{
data._prevEmitterPos.x = p.x;
data._prevEmitterPos.y = p.y;
}
data._emit = false;
data._spawnTimer = 0;
data._emitterLife = 0;
data._prevPosIsValid = false;
data._spawn = false;
};
TRP_EmitterEx.prototype.applyCapacityLimit = function(){
var naturalCapacity = this.naturalCapacity(this._originalFrequency,this._originalParticlesPerWave);
var subCapacity = this.subEmittersCapacity();
var mainRate = Math.pow(this._capacityRate,naturalCapacity/((naturalCapacity+subCapacity)||1));
var subRate = this._capacityRate/(mainRate||1);
//main limit
var target = naturalCapacity*mainRate;
this.maxParticles = target;
if(this.particlesPerWave>1){
this.particlesPerWave = Math.ceil(Math.min(this._originalParticlesPerWave,this._originalParticlesPerWave*(target/naturalCapacity)))||1;
naturalCapacity = this.naturalCapacity(this._originalFrequency,this.particlesPerWave);
}
this.frequency = Math.max(this._originalFrequency,this._originalFrequency / (target/naturalCapacity));
//sub limit
var length = this._subEmitters.length;
for(var i=0; i<length; i=(i+1)|0){
var sub = this._subEmitters[i];
sub.capacityRate = subRate;
sub.maxParticles = sub._originalMaxParticles*subRate;
}
};
TRP_EmitterEx.prototype.particleCapacity = function(){
var capacity = _super.prototype.particleCapacity.call(this);
var subCapacity = this.subEmittersCapacity();
return capacity*subCapacity;
};
TRP_EmitterEx.prototype.subEmittersCapacity = function(){
var subCapacity = 1;
var length = this._subEmitters.length;
for(var i=0; i<length; i=(i+1)|0){
subCapacity += this._subEmitters[i].particleCapacity();
}
return subCapacity;
}
return TRP_EmitterEx;
}(TRP_Emitter));
ParticleEmitter.TRP_EmitterEx = TRP_EmitterEx;
//=============================================================================
// TRP_SubEmitter
//=============================================================================
var TRP_SubEmitter = /** @class */(function(_super){
__extends(TRP_SubEmitter,_super);
var utils = PIXI.particles.ParticleUtils;
function TRP_SubEmitter(particleParent, particleImages, config, timing=0, endTiming=-1, speedRate=0, inheritAngle=0, inheritScale=0){
var _this = TRP_Emitter.call(this,particleParent, particleImages, config)||this;
_this._particleConstructor = TRP_Particle;
_this.timing = timing;
_this.endTiming = endTiming;
_this.speedRate = speedRate;
_this.inheritAngle = inheritAngle;
_this.inheritScale = inheritScale;
return _this;
};
TRP_SubEmitter.prototype.update = function(delta){
if (this._autoUpdate) {
delta = delta / pixi.settings.TARGET_FPMS / 1000;
}
if (!this._parent) return;
var i, particle, next;
for (particle = this._activeParticlesFirst; particle; particle = next) {
next = particle.next;
particle.update(delta);
}
};
TRP_SubEmitter.prototype.updateParticleEmitter = function(ep,lerp,delta,data){
//data ~ time,
//ep : emitter particle
if(!data._emit){
if(!data._spawn && lerp>=this.timing){
data._emit = true;
data._spawn = true;
data._emitterLife = this.emitterLifetime
}else{
return;
}
}else if(this.endTiming>=0 && lerp>=this.endTiming){
data._spawnTimer = 0;
data._emitterLife = 0;
data._emit = false;
return;
}
if (!this._parent)
return;
if (this._autoUpdate) {
delta = delta / pixi.settings.TARGET_FPMS / 1000;
}
//update existing particles
var prevX, prevY;
//if the previous position is valid, store these for later interpolation
if (data._prevPosIsValid) {
prevX = data._prevEmitterPos.x;
prevY = data._prevEmitterPos.y;
}
//store current position of the emitter as local variables
var curX = ep.x + this.spawnPos.x;
var curY = ep.y + this.spawnPos.y;
var posChanged = data._prevPosIsValid && (prevX!==curX || prevY!==curY);
//spawn new particles
if (this._emit) {
//decrease spawn timer
data._spawnTimer -= delta < 0 ? 0 : delta;
//while _spawnTimer < 0, we have particles to spawn
while (data._spawnTimer <= 0) {
//determine if the emitter should stop spawning
if (data._emitterLife > 0) {
data._emitterLife -= this._frequency;
if (data._emitterLife <= 0) {
data._spawnTimer = 0;
data._emitterLife = 0;
data._emit = false;
break;
}
}
//determine if we have hit the particle limit
if (this.particleCount >= this.maxParticles) {
data._spawnTimer += this._frequency;
continue;
}
//determine the particle lifetime
var lifetime = void 0;
if (this.minLifetime == this.maxLifetime)
lifetime = this.minLifetime;
else
lifetime = Math.random() * (this.maxLifetime - this.minLifetime) + this.minLifetime;
//only make the particle if it wouldn't immediately destroy itself
if (-data._spawnTimer < lifetime) {
//If the position has changed and this isn't the first spawn,
//interpolate the spawn position
var emitPosX = void 0, emitPosY = void 0;
if (data._prevPosIsValid && posChanged) {
//1 - _spawnTimer / delta, but _spawnTimer is negative
var lerp = 1 + data._spawnTimer / delta;
emitPosX = (curX - prevX) * lerp + prevX;
emitPosY = (curY - prevY) * lerp + prevY;
}
else //otherwise just set to the spawn position
{
emitPosX = curX;
emitPosY = curY;
}
//create enough particles to fill the wave (non-burst types have a wave of 1)
var i = 0;
for (var len = Math.min(this.particlesPerWave, this.maxParticles - this.particleCount); i < len; ++i) {
//see if we actually spawn one
if (this.spawnChance < 1 && Math.random() >= this.spawnChance)
continue;
//create particle
var p = void 0;
if (this._poolFirst) {
p = this._poolFirst;
this._poolFirst = this._poolFirst.next;
p.next = null;
}
else {
p = new this.particleConstructor(this);
}
//set a random texture if we have more than one
if (this.particleImages.length > 1) {
// if using ordered art
if (this._currentImageIndex !== -1) {
// get current art index, then increment for the next particle
p.applyArt(this.particleImages[this._currentImageIndex++]);
// loop around if needed
if (this._currentImageIndex < 0 || this._currentImageIndex >= this.particleImages.length) {
this._currentImageIndex = 0;
}
}
// otherwise grab a random one
else {
p.applyArt(this.particleImages[Math.floor(Math.random() * this.particleImages.length)]);
}
}
else {
//if they are actually the same texture, a standard particle
//will quit early from the texture setting in setTexture().
p.applyArt(this.particleImages[0]);
}
//set up the start and end values
p.alphaList.reset(this.startAlpha);
p.speedList.reset(this.startSpeed);
if (this.minimumSpeedMultiplier != 1) {
p.speedMultiplier = Math.random() * (1 - this.minimumSpeedMultiplier) + this.minimumSpeedMultiplier;
}
p.acceleration.x = this.acceleration.x;
p.acceleration.y = this.acceleration.y;
p.maxSpeed = this.maxSpeed;
if (this.minimumScaleMultiplier != 1) {
p.scaleMultiplier = Math.random() * (1 - this.minimumScaleMultiplier) + this.minimumScaleMultiplier;
}
p.scaleList.reset(this.startScale);
p.colorList.reset(this.startColor);
//randomize the rotation speed
if (this.minRotationSpeed == this.maxRotationSpeed)
p.rotationSpeed = this.minRotationSpeed;
else
p.rotationSpeed = Math.random() * (this.maxRotationSpeed - this.minRotationSpeed) + this.minRotationSpeed;
p.rotationAcceleration = this.rotationAcceleration;
p.noRotation = this.noRotation;
//set up the lifetime
p.maxLife = lifetime;
//set the blend mode
p.blendMode = this.particleBlendMode;
//set the custom ease, if any
p.ease = this.customEase;
//set the extra data, if any
p.extraData = this.extraData;
//set additional properties to particle
this.applyAdditionalProperties(p);
//call the proper function to handle rotation and position of particle
this._spawnFunc(p, emitPosX, emitPosY, i);
if(this.inheritScale>0){
p.scaleMultiplier *= ep.scaleMultiplier;
}
//initialize particle
p.init();
//inertia
p.iVelocity.x = this.speedRate*ep.velocity.x;
p.iVelocity.y = this.speedRate*ep.velocity.y;
p._doInertia = !!(p.iVelocity.x||p.iVelocity.y);
//inheritAngle
if(this.inheritAngle>0){
var v1Rotation = Math.atan2(ep.velocity.y, ep.velocity.x);
utils.rotatePoint(v1Rotation/utils.DEG_TO_RADS, p.velocity);
p.rotation += v1Rotation;
}
//update the particle by the time passed, so the particles are spread out properly
p.update(-data._spawnTimer); //we want a positive delta, because a negative delta messes things up
//add the particle to the display list
if (!p.parent) {
if (this.addAtBack)
this._parent.addChildAt(p, 0);
else
this._parent.addChild(p);
}
else {
//kind of hacky, but performance friendly
//shuffle children to correct place
var children = this._parent.children;
//avoid using splice if possible
if (children[0] == p)
children.shift();
else if (children[children.length - 1] == p)
children.pop();
else {
var index = children.indexOf(p);
children.splice(index, 1);
}
if (this.addAtBack)
children.unshift(p);
else
children.push(p);
}
//add particle to list of active particles
if (this._activeParticlesLast) {
this._activeParticlesLast.next = p;
p.prev = this._activeParticlesLast;
this._activeParticlesLast = p;
}
else {
this._activeParticlesLast = this._activeParticlesFirst = p;
}
++this.particleCount;
}
}
//increase timer and continue on to any other particles that need to be created
data._spawnTimer += this._frequency;
}
//if the position changed before this update, then keep track of that
data._prevEmitterPos.x = curX;
data._prevEmitterPos.y = curY;
data._prevPosIsValid = true;
}
};
return TRP_SubEmitter;
}(ParticleEmitter.TRP_Emitter));
//=============================================================================
// TRP_ParticleEx
//=============================================================================
var TRP_Particle = ParticleEmitter.TRP_Particle;
var TRP_ParticleEx = /** @class */(function(_super){
__extends(TRP_ParticleEx,_super);
var utils = PIXI.particles.ParticleUtils;
function TRP_ParticleEx(emitter){
var _this = _super.call(this,emitter)||this;
_this.subEmitters = null;
_this.subEmitterData = [];
return _this;
};
TRP_ParticleEx.prototype.kill = function () {
var emitters = this.subEmitters;
var length = emitters ? emitters.length : 0;
for(var i=0; i<length; i=(i+1)|0){
var data = this.subEmitterData[i];
if(!data._spawn || data._emitterLife>0){
return;
}
}
_super.prototype.kill.call(this);
}
TRP_ParticleEx.prototype.update = function(delta){
var lerp = _super.prototype.update.call(this,delta);
if(this._wait>0)return lerp;
var emitters = this.subEmitters;
var length = emitters ? emitters.length : 0;
var subLerp = lerp<0 ? 1 : lerp;
for(var i=0; i<length; i=(i+1)|0){
emitters[i].updateParticleEmitter(this,subLerp,delta,this.subEmitterData[i]);
}
return lerp;
};
return TRP_ParticleEx;
}(TRP_Particle));
/* cache config
===================================*/
(function(){
'use strict';
if(!baseParameters.useCache||baseParameters.useCache==='false')return;
//=============================================================================
// TRP_Emitter
//=============================================================================
var Emitter = PIXI.particles.Emitter;
var TRP_Emitter = ParticleEmitter.TRP_Emitter;
var TRP_EmitterEx = ParticleEmitter.TRP_EmitterEx;
if(TRP_EmitterEx){
var _TRP_EmitterEx_applyAdditionalProperties = TRP_EmitterEx.prototype.applyAdditionalProperties;
TRP_EmitterEx.prototype.applyAdditionalProperties = function(p){
_TRP_EmitterEx_applyAdditionalProperties.call(this,p);
var naturalCapacity = this.naturalCapacity(this._originalFrequency,this._originalParticlesPerWave);
var rate = naturalCapacity -1;
var subEmitters = this._subEmitters;
var length = subEmitters.length;
for(var i=0; i<length; i=(i+1)|0){
var emitter = subEmitters[i];
emitter.preparePoolFromCache(rate);
}
};
}
})();
})();