More particles fixes

This commit is contained in:
Lizard-13
2018-04-13 06:27:37 -03:00
parent fb3a0edfac
commit 9ce734e204
5 changed files with 42 additions and 56 deletions

View File

@@ -60,7 +60,7 @@
<variables />
<behaviors />
</object>
<object additive="true" alphaParam="Mutable" angleParam="Random" blueParam="Mutable" destroyWhenNoParticles="true" emissionEditionSimpleMode="true" emitterAngleA="0.000000" emitterAngleB="360.000000" emitterForceMax="130.000000" emitterForceMin="50.000000" emitterXDirection="1.000000" emitterYDirection="0.000000" emitterZDirection="1.000000" flow="-1.000000" friction="2.000000" gravityEditionSimpleMode="false" greenParam="Mutable" maxParticleNb="151" name="Explosion2" particleAlpha1="204.000000" particleAlpha2="0.000000" particleAlphaRandomness1="0.000000" particleAlphaRandomness2="0.000000" particleAngle1="0.000000" particleAngle2="0.000000" particleAngleRandomness1="0.000000" particleAngleRandomness2="0.000000" particleBlue1="25.000000" particleBlue2="75.000000" particleEditionSimpleMode="false" particleGravityX="0.000000" particleGravityY="0.000000" particleGravityZ="30.000000" particleGreen1="76.000000" particleGreen2="180.000000" particleLifeTimeMax="1.500000" particleLifeTimeMin="0.700000" particleRed1="153.000000" particleRed2="1.000000" particleSize1="100.000000" particleSize2="100.000000" particleSizeRandomness1="0.000000" particleSizeRandomness2="0.000000" redParam="Enabled" rendererParam1="3.000000" rendererParam2="6.000000" rendererType="Line" sizeParam="Random" tank="40.000000" textureParticleName="" type="ParticleSystem::ParticleEmitter" zoneRadius="2.000000">
<object additive="true" alphaParam="Mutable" angleParam="Random" blueParam="Mutable" destroyWhenNoParticles="true" emissionEditionSimpleMode="true" emitterAngleA="0.000000" emitterAngleB="360.000000" emitterForceMax="130.000000" emitterForceMin="130.000000" emitterXDirection="1.000000" emitterYDirection="0.000000" emitterZDirection="1.000000" flow="-1.000000" friction="2.000000" gravityEditionSimpleMode="false" greenParam="Mutable" maxParticleNb="151" name="Explosion2" particleAlpha1="204.000000" particleAlpha2="0.000000" particleAlphaRandomness1="0.000000" particleAlphaRandomness2="0.000000" particleAngle1="0.000000" particleAngle2="0.000000" particleAngleRandomness1="0.000000" particleAngleRandomness2="0.000000" particleBlue1="25.000000" particleBlue2="75.000000" particleEditionSimpleMode="false" particleGravityX="0.000000" particleGravityY="0.000000" particleGravityZ="30.000000" particleGreen1="76.000000" particleGreen2="180.000000" particleLifeTimeMax="1.000000" particleLifeTimeMin="0.700000" particleRed1="153.000000" particleRed2="1.000000" particleSize1="100.000000" particleSize2="100.000000" particleSizeRandomness1="0.000000" particleSizeRandomness2="0.000000" redParam="Enabled" rendererParam1="3.000000" rendererParam2="6.000000" rendererType="Line" sizeParam="Random" tank="40.000000" textureParticleName="" type="ParticleSystem::ParticleEmitter" zoneRadius="2.000000">
<variables />
<behaviors />
</object>

View File

@@ -122,7 +122,7 @@
<variables />
<behaviors />
</object>
<object additive="true" alphaParam="Mutable" angleParam="Random" blueParam="Random" destroyWhenNoParticles="true" emissionEditionSimpleMode="true" emitterAngleA="0.000000" emitterAngleB="360.000000" emitterForceMax="100.000000" emitterForceMin="25.000000" emitterXDirection="0.000000" emitterYDirection="0.000000" emitterZDirection="1.000000" flow="70.000000" friction="2.000000" gravityEditionSimpleMode="true" greenParam="Enabled" maxParticleNb="100" name="Pyro" particleAlpha1="204.000000" particleAlpha2="0.000000" particleAlphaRandomness1="0.000000" particleAlphaRandomness2="0.000000" particleAngle1="0.000000" particleAngle2="0.000000" particleAngleRandomness1="0.000000" particleAngleRandomness2="0.000000" particleBlue1="204.000000" particleBlue2="255.000000" particleEditionSimpleMode="false" particleGravityX="-0.000080" particleGravityY="-200.000000" particleGravityZ="0.000000" particleGreen1="127.000000" particleGreen2="1.000000" particleLifeTimeMax="1.000000" particleLifeTimeMin="0.500000" particleRed1="127.000000" particleRed2="230.000000" particleSize1="100.000000" particleSize2="1.000000" particleSizeRandomness1="0.000000" particleSizeRandomness2="0.000000" redParam="Random" rendererParam1="8.000000" rendererParam2="8.000000" rendererType="Line" sizeParam="Mutable" tank="80.000000" textureParticleName="" type="ParticleSystem::ParticleEmitter" zoneRadius="25.000000">
<object additive="true" alphaParam="Mutable" angleParam="Random" blueParam="Random" destroyWhenNoParticles="true" emissionEditionSimpleMode="true" emitterAngleA="0.000000" emitterAngleB="360.000000" emitterForceMax="100.000000" emitterForceMin="25.000000" emitterXDirection="0.000000" emitterYDirection="0.000000" emitterZDirection="1.000000" flow="70.000000" friction="2.000000" gravityEditionSimpleMode="true" greenParam="Enabled" maxParticleNb="151" name="Pyro" particleAlpha1="204.000000" particleAlpha2="0.000000" particleAlphaRandomness1="0.000000" particleAlphaRandomness2="0.000000" particleAngle1="0.000000" particleAngle2="0.000000" particleAngleRandomness1="0.000000" particleAngleRandomness2="0.000000" particleBlue1="204.000000" particleBlue2="255.000000" particleEditionSimpleMode="false" particleGravityX="-0.000080" particleGravityY="-200.000000" particleGravityZ="0.000000" particleGreen1="127.000000" particleGreen2="1.000000" particleLifeTimeMax="1.000000" particleLifeTimeMin="0.500000" particleRed1="127.000000" particleRed2="230.000000" particleSize1="100.000000" particleSize2="1.000000" particleSizeRandomness1="0.000000" particleSizeRandomness2="0.000000" redParam="Random" rendererParam1="8.000000" rendererParam2="8.000000" rendererType="Line" sizeParam="Mutable" tank="80.000000" textureParticleName="" type="ParticleSystem::ParticleEmitter" zoneRadius="25.000000">
<variables />
<behaviors />
</object>

View File

@@ -17,11 +17,12 @@ gdjs.ParticleEmitterObjectCocosRenderer = function(runtimeScene, runtimeObject,
renderTexture = new cc.RenderTexture(this.originalSize, this.originalSize);
}
else if(objectData.rendererType === "Line"){
drawer.drawRect(cc.p((this.originalSize - objectData.rendererParam1)/2.0,
(this.originalSize - objectData.rendererParam2)/2.0),
cc.p((this.originalSize + objectData.rendererParam1)/2.0,
(this.originalSize + objectData.rendererParam2)/2.0),
cc.color(255,255,255,200), 1 , cc.color(255,255,255,255));
this.originalSize = Math.max(2*objectData.rendererParam1, objectData.rendererParam2);
drawer.drawRect(cc.p(this.originalSize/2.0,
(this.originalSize - objectData.rendererParam2)/2.0),
cc.p(this.originalSize/2.0 + objectData.rendererParam1,
(this.originalSize + objectData.rendererParam2)/2.0),
cc.color(255,255,255,255), 0.01 , cc.color(255,255,255,0));
renderTexture = new cc.RenderTexture(this.originalSize, this.originalSize);
}
else{
@@ -38,7 +39,7 @@ gdjs.ParticleEmitterObjectCocosRenderer = function(runtimeScene, runtimeObject,
(this.originalSize - objectData.rendererParam2)/2.0),
cc.p((this.originalSize + objectData.rendererParam1)/2.0,
(this.originalSize + objectData.rendererParam2)/2.0),
cc.color(255,255,255,200), 1 , cc.color(255,255,255,255));
cc.color(255,255,255,255), 0.01 , cc.color(255,255,255,255));
renderTexture = new cc.RenderTexture(this.originalSize, this.originalSize);
}
}

View File

@@ -13,8 +13,12 @@ gdjs.ParticleEmitterObjectPixiRenderer = function(runtimeScene, runtimeObject, o
graphics.beginFill(gdjs.rgbToHexNumber(255,255,255), 1);
if(objectData.rendererType === "Point")
graphics.drawCircle(0, 0, objectData.rendererParam1);
else if(objectData.rendererType === "Line")
else if(objectData.rendererType === "Line"){
graphics.drawRect(objectData.rendererParam1, 0, objectData.rendererParam1, objectData.rendererParam2);
// Draw an almost-invisible rectangle in the left hand to force PIXI to take a full texture with our line at the right hand
graphics.beginFill(gdjs.rgbToHexNumber(255,255,255), 0.001);
graphics.drawRect(0, 0, objectData.rendererParam1, objectData.rendererParam2);
}
else{
if(objectData.textureParticleName){
var sprite = new PIXI.Sprite(runtimeScene.getGame().getImageManager().getPIXITexture(objectData.textureParticleName));
@@ -47,19 +51,6 @@ gdjs.ParticleEmitterObjectPixiRenderer = function(runtimeScene, runtimeObject, o
],
isStepped: false
},
speed: {
list: [
{
value: objectData.emitterForceMin,
time: 0
},
{
value: objectData.emitterForceMax,
time: 1
}
],
isStepped: false
},
acceleration: {
x: objectData.particleGravityX,
y: objectData.particleGravityY
@@ -92,21 +83,19 @@ gdjs.ParticleEmitterObjectPixiRenderer = function(runtimeScene, runtimeObject, o
}
};
// We need to adapt a bit the configuration of the speed of particles, instead of random minimum and maximum speed,
// pixi-particles uses initial and final speed, this behavior can lead to a non-working particle system without this patch
if(config.acceleration.x === 0 && config.acceleration.y === 0 &&
config.speed.list[0].value === 0 && config.speed.list[1].value !== 0){
config.speed.list[0].value = 0.00001;
}
config.speed = { list: [{time: 0, value: objectData.emitterForceMax}],
minimumSpeedMultiplier: objectData.emitterForceMax !== 0 ?
objectData.emitterForceMin / objectData.emitterForceMax : 1,
isStepped: false };
if(objectData.alphaParam === "Mutable"){
config.alpha = {list: [{time: 0, value: objectData.particleAlpha1/255.0},
{time: 1, value: objectData.particleAlpha2/255.0}],
isStepped: false};
config.alpha = { list: [{time: 0, value: objectData.particleAlpha1/255.0},
{time: 1, value: objectData.particleAlpha2/255.0}],
isStepped: false };
}
else{
config.alpha = {list: [{time: 0, value: objectData.particleAlpha1/255.0}],
isStepped: false};
config.alpha = { list: [{time: 0, value: objectData.particleAlpha1/255.0}],
isStepped: false };
}
if(objectData.sizeParam === "Mutable"){
@@ -115,10 +104,10 @@ gdjs.ParticleEmitterObjectPixiRenderer = function(runtimeScene, runtimeObject, o
var sizeRandom1 = objectData.particleSizeRandomness1/100;
var sizeRandom2 = objectData.particleSizeRandomness2/100;
var m = sizeRandom2 !== 0 ? (1 + sizeRandom1)/(1 + sizeRandom2) : 1;
config.scale = {list: [{time: 0, value: size1*(1+sizeRandom1)},
{time: 1, value: size2*(1+sizeRandom2)}],
minimumScaleMultiplier: m,
isStepped: false};
config.scale = { list: [{time: 0, value: size1*(1 + sizeRandom1)},
{time: 1, value: size2*(1 + sizeRandom2)}],
minimumScaleMultiplier: m,
isStepped: false };
}
else{
var size1 = objectData.particleSize1/100;
@@ -128,19 +117,19 @@ gdjs.ParticleEmitterObjectPixiRenderer = function(runtimeScene, runtimeObject, o
mult = (1 + size2)/(1 + size1);
size2 = size1;
}
config.scale = {list: [{time: 0, value: size2}],
minimumScaleMultiplier: mult,
isStepped: false};
config.scale = { list: [{time: 0, value: size2}],
minimumScaleMultiplier: mult,
isStepped: false };
}
if(objectData.emissionEditionSimpleMode){
config.startRotation = {min:-objectData.emitterAngleB/2.0,
max: objectData.emitterAngleB/2.0};
config.startRotation = { min:-objectData.emitterAngleB/2.0,
max: objectData.emitterAngleB/2.0 };
}
else{
config.startRotation = {min: objectData.emitterAngleA,
max: objectData.emitterAngleB};
config.startRotation = { min: objectData.emitterAngleA,
max: objectData.emitterAngleB };
}
if(objectData.angleParam === "Mutable"){
@@ -188,14 +177,8 @@ gdjs.ParticleEmitterObjectPixiRenderer.prototype.setAngle = function(angle1, ang
};
gdjs.ParticleEmitterObjectPixiRenderer.prototype.setForce = function(min, max){
// We need to adapt a bit the configuration of the speed of particles, instead of random minimum and maximum speed,
// pixi-particles uses initial and final speed, this behavior can lead to a non-working particle system without this patch
if(this.emitter.acceleration.x === 0 && this.emitter.acceleration.y === 0 && min === 0 && max !== 0){
min = 0.00001;
}
this.emitter.startSpeed.value = min;
if(this.emitter.startSpeed.next) this.emitter.startSpeed.next.value = max;
this.emitter.startSpeed.value = max;
this.emitter.minimumSpeedMultiplier = max !== 0 ? min/max : 1;
};
gdjs.ParticleEmitterObjectPixiRenderer.prototype.setZoneRadius = function(radius){
@@ -235,9 +218,10 @@ gdjs.ParticleEmitterObjectPixiRenderer.prototype.setAlpha = function(alpha1, alp
}
};
gdjs.ParticleEmitterObjectPixiRenderer.prototype.setFlow = function(flow){
gdjs.ParticleEmitterObjectPixiRenderer.prototype.setFlow = function(flow, tank){
this.emitter.frequency = flow < 0 ? 0.0001 : 1.0/flow;
// TODO: This should also affect emitter lifetime.
this.emitterLifetime = tank < 0 ? -1 :
(flow < 0 ? 0.001 : (tank - this.emitter.totalParticleCount) / flow);
};
gdjs.ParticleEmitterObjectPixiRenderer.prototype.isTextureValid = function(texture, runtimeScene){

View File

@@ -37,6 +37,7 @@ gdjs.ParticleEmitterObject = function(runtimeScene, objectData){
this.rendererParam2 = objectData.rendererParam2;
this.texture = objectData.textureParticleName;
this.flow = objectData.flow;
this.tank = objectData.tank;
this.destroyWhenNoParticles = objectData.destroyWhenNoParticles;
this._posDirty = true;
@@ -105,7 +106,7 @@ gdjs.ParticleEmitterObject.prototype.update = function(runtimeScene){
this.renderer.setAlpha(this.alpha1, this.alpha2);
}
if(this._flowDirty){
this.renderer.setFlow(this.flow);
this.renderer.setFlow(this.flow, this.tank);
}
if(this._textureDirty){
this.renderer.setTexture(this.texture, runtimeScene);
@@ -117,7 +118,7 @@ gdjs.ParticleEmitterObject.prototype.update = function(runtimeScene){
this.renderer.update(this.getElapsedTime(runtimeScene)/1000.0);
if(this.tank < 0 && this.renderer.getTotalParticleCount() > this.tank){
if(this.tank > 0 && this.renderer.getTotalParticleCount() > this.tank){
this.renderer.stop();
}