proton-engine
Version:
Proton is a simple and powerful javascript particle animation engine.
78 lines (68 loc) • 2.28 kB
JavaScript
import Util from "../utils/Util";
import Vector2D from "../math/Vector2D";
import Behaviour from "./Behaviour";
export default class GravityWell extends Behaviour {
/**
* @memberof! Proton#
* @augments Behaviour
* @constructor
* @alias GravityWell
*
* @param {Vector2D} [centerPoint=new Vector2D] The point in the center
* @param {Number} [force=100] The force
* @param {Number} [life=Infinity] this behaviour's life
* @param {String} [easing=easeLinear] this behaviour's easing
*
* @property {String} name The Behaviour name
*/
constructor(centerPoint, force, life, easing) {
super(life, easing);
this.distanceVec = new Vector2D();
this.centerPoint = Util.initValue(centerPoint, new Vector2D());
this.force = Util.initValue(this.normalizeValue(force), 100);
this.name = "GravityWell";
}
/**
* Reset this behaviour's parameters
*
* @method reset
* @memberof Proton#GravityWell
* @instance
*
* @param {Vector2D} [centerPoint=new Vector2D] The point in the center
* @param {Number} [force=100] The force
* @param {Number} [life=Infinity] this behaviour's life
* @param {String} [easing=easeLinear] this behaviour's easing
*/
reset(centerPoint, force, life, easing) {
this.distanceVec = new Vector2D();
this.centerPoint = Util.initValue(centerPoint, new Vector2D());
this.force = Util.initValue(this.normalizeValue(force), 100);
life && super.reset(life, easing);
}
/**
* @inheritdoc
*/
initialize(particle) {}
/**
* Apply this behaviour for all particles every time
*
* @method applyBehaviour
* @memberof Proton#GravityWell
* @instance
*
* @param {Particle} particle
* @param {Number} the integrate time 1/ms
* @param {Int} the particle index
*/
applyBehaviour(particle, time, index) {
this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);
const distanceSq = this.distanceVec.lengthSq();
if (distanceSq !== 0) {
const distance = this.distanceVec.length();
const factor = (this.force * time) / (distanceSq * distance);
particle.v.x += factor * this.distanceVec.x;
particle.v.y += factor * this.distanceVec.y;
}
}
}