mirror of
https://github.com/4ian/GDevelop.git
synced 2025-10-15 10:19:04 +00:00
More particles fixes
This commit is contained in:
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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){
|
||||
|
@@ -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();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user