blob: cf474e41423888faccde6d304fd024f1be91abdf [file] [log] [blame]
function Particle(stage)
{
this.stage = stage;
this.rotater = Stage.randomRotater();
this.reset();
this.move();
}
Particle.prototype =
{
sizeMinimum: 40,
sizeRange: 10,
reset: function()
{
var randSize = Math.round(Math.pow(Pseudo.random(), 4) * this.sizeRange + this.sizeMinimum);
this.size = new Point(randSize, randSize);
this.minPosition = this.size.center;
this.maxPosition = this.stage.size.subtract(this.minPosition);
},
animate: function(timeDelta)
{
this.rotater.next(timeDelta);
this.position = this.position.add(this.velocity.multiply(timeDelta));
this.velocity.y += 0.03;
// If particle is going to move off right side
if (this.position.x > this.maxPosition.x) {
if (this.velocity.x > 0)
this.velocity.x *= -1;
this.position.x = this.maxPosition.x;
} else if (this.position.x < this.minPosition.x) {
// If particle is going to move off left side
if (this.velocity.x < 0)
this.velocity.x *= -1;
this.position.x = this.minPosition.x;
}
// If particle is going to move off bottom side
if (this.position.y > this.maxPosition.y) {
// Adjust direction but maintain magnitude
var magnitude = this.velocity.length();
this.velocity.x *= 1.5 + .005 * this.size.x;
this.velocity = this.velocity.normalize().multiply(magnitude);
if (Math.abs(this.velocity.y) < 0.7)
this.reset();
else {
if (this.velocity.y > 0)
this.velocity.y *= -0.999;
this.position.y = this.maxPosition.y;
}
} else if (this.position.y < this.minPosition.y) {
// If particle is going to move off top side
var magnitude = this.velocity.length();
this.velocity.x *= 1.5 + .005 * this.size.x;
this.velocity = this.velocity.normalize().multiply(magnitude);
if (this.velocity.y < 0)
this.velocity.y *= -0.998;
this.position.y = this.minPosition.y;
}
this.move();
},
move: function()
{
}
}
ParticlesStage = Utilities.createSubclass(Stage,
function()
{
Stage.call(this);
this.particles = [];
}, {
animate: function(timeDelta)
{
timeDelta /= 4;
this.particles.forEach(function(particle) {
particle.animate(timeDelta);
});
},
tune: function(count)
{
if (count == 0)
return;
if (count > 0) {
for (var i = 0; i < count; ++i)
this.particles.push(this.createParticle());
return;
}
count = Math.min(-count, this.particles.length);
if (typeof(this.willRemoveParticle) == "function") {
for (var i = 0; i < count; ++i)
this.willRemoveParticle(this.particles[i]);
}
this.particles.splice(0, count);
},
complexity: function()
{
return this.particles.length;
}
});