983 lines
31 KiB
JavaScript
983 lines
31 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;
|
|
} //otherwise just set to the spawn position
|
|
else {
|
|
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);
|
|
}
|
|
};
|
|
}
|
|
})();
|
|
})();
|