diff --git a/examples/particles/particles.js b/examples/particles/particles.js index 956fb94..a2afdf9 100644 --- a/examples/particles/particles.js +++ b/examples/particles/particles.js @@ -9,11 +9,11 @@ class BlueParticle extends MomentumEngine.Classes.Rect { constructor (x, y) { super(x, y, 1, 1, new MomentumEngine.Classes.Color(255, 255, 255, 0)); - this.timeToLive = 5000; + this.timeToLive = 15000; } update (delta) { - this.color.a = this.color.a - (delta * 0.00025); + this.color.a = this.color.a - (delta * 0.00005); } } @@ -37,17 +37,29 @@ window.onload = function () { }); let black = new MomentumEngine.Classes.Color(0, 0, 0), - red = new MomentumEngine.Classes.Color(255, 0, 0); + red = new MomentumEngine.Classes.Color(255, 0, 0), + blue = new MomentumEngine.Classes.Color(0, 0, 255); let mainScene = new MomentumEngine.Classes.Rect(0, 0, width, height, black); particles.addChildEntity(mainScene); - let rect = new MomentumEngine.Classes.Rect(width / 2 - baseSize, height / 2 - baseSize, baseSize * 2, baseSize * 2, red), + let rect = new MomentumEngine.Classes.Rect(width / 8 - baseSize, height / 2 - baseSize, baseSize * 2, baseSize * 2, red), emitter = new MomentumEngine.Classes.Emitter(baseSize, baseSize, 4, new MomentumEngine.Classes.Vector2D(0, 0.05), BlueParticle); + let fieldRect = new MomentumEngine.Classes.Rect(width - (baseSize * 33), height - (baseSize * 10), baseSize * 2, baseSize * 2, blue), + field = new MomentumEngine.Classes.Field(baseSize, baseSize, 0.1); + + let fieldRect2 = new MomentumEngine.Classes.Rect(width - (baseSize * 33), baseSize * 10, baseSize * 2, baseSize * 2, blue), + field2 = new MomentumEngine.Classes.Field(baseSize, baseSize, 0.1); + mainScene.addChildEntity(rect); rect.addChildEntity(emitter); + mainScene.addChildEntity(fieldRect); + fieldRect.addChildEntity(field); + mainScene.addChildEntity(fieldRect2); + fieldRect2.addChildEntity(field2); + rect.update = function (delta) { if (particles.inputs.keyboard.isPressed(KeyConsts.UP)) { @@ -69,6 +81,8 @@ window.onload = function () { }; emitter.setParticleParent(mainScene); + emitter.particleFields.push(field, field2); + //emitter.spread = Math.PI / 32; emitter.emitting = true; particles.start(); diff --git a/src/classes/emitter.js b/src/classes/emitter.js index a46f9b9..fc7b1a7 100644 --- a/src/classes/emitter.js +++ b/src/classes/emitter.js @@ -3,6 +3,8 @@ import Entity from "./entity.js"; import Vector2D from "./vector2d.js"; +import Utils from "../libs/utils"; + class Emitter extends Entity { @@ -13,6 +15,7 @@ class Emitter extends Entity { this.particleVelocity = velocity; this.particleClass = particle; + this.particleFields = []; this.rate = rate; this.emitting = false; @@ -41,6 +44,7 @@ class Emitter extends Entity { let particle = new ParticleClass(this._calculatedPos.x, this._calculatedPos.y); particle.velocity = velocity; + Utils.mergeIntoArray(particle.fields, this.particleFields); //this._particles.push(particle); parent.addChildEntity(particle); diff --git a/src/classes/entity.js b/src/classes/entity.js index 113764b..b2232b9 100644 --- a/src/classes/entity.js +++ b/src/classes/entity.js @@ -11,6 +11,8 @@ class Entity { this.velocity = new Vector2D(0, 0); this.acceleration = new Vector2D(0, 0); + this.fields = []; + this.state = {}; this.children = []; @@ -130,6 +132,33 @@ class Entity { } + _calculateFields (delta) { + + this._preprocess(); // NK: I don't like calling preprocess everywhere outside of the render method... + + let acceleration = new Vector2D(0, 0); + + for (let i = 0; i < this.fields.length; i++) { + + let field = this.fields[i]; + field._preprocess(); + + let vector = new Vector2D( + field._calculatedPos.x - this._calculatedPos.x, + field._calculatedPos.y - this._calculatedPos.y + ); + + let force = field.mass / Math.pow(vector.dot(vector), 1.5); + + acceleration.add(vector.multiply(force).multiply(delta)); + + } + + return this.acceleration.clone().add(acceleration); + + } + + _updateEntity (delta) { if (this.timeToLive) { @@ -139,12 +168,9 @@ class Entity { } // Calculate new position based on velocity and acceleration if there's one set - if (this.velocity) { - - if (this.acceleration) { - this.velocity.add(this.acceleration); - } + if (this.velocity && (this.velocity.x !== 0 || this.velocity.y !== 0)) { + this.velocity.add(this._calculateFields(delta)); this.pos.add(this.velocity.clone().multiply(delta)); } diff --git a/src/classes/field.js b/src/classes/field.js new file mode 100644 index 0000000..52df135 --- /dev/null +++ b/src/classes/field.js @@ -0,0 +1,21 @@ +"use strict"; + +import Entity from "./entity.js"; +import Vector2D from "./vector2d.js"; + + +class Field extends Entity { + + + constructor (x, y, mass) { + + super(x, y); + this.mass = mass; + + } + + +} + + +export default Field; \ No newline at end of file diff --git a/src/es5.js b/src/es5.js index f2bcf63..9253aea 100644 --- a/src/es5.js +++ b/src/es5.js @@ -2,6 +2,7 @@ import Game from "./classes/game.js"; import Emitter from "./classes/emitter.js"; +import Field from "./classes/field.js"; import Entity from "./classes/entity.js"; import Vector2D from "./classes/vector2d.js"; import Sprite from "./classes/sprite.js"; @@ -13,14 +14,15 @@ import {KeyConsts} from "./classes/keyboardinput.js"; const Classes = { - Game: Game, - Emitter: Emitter, - Entity: Entity, - Sprite: Sprite, - Rect: Rect, - Vector2D: Vector2D, - Color: Color, - ImageLoader: ImageLoader + Game, + Emitter, + Field, + Entity, + Sprite, + Rect, + Vector2D, + Color, + ImageLoader }; diff --git a/src/es6.js b/src/es6.js index 5dafa0c..f8bed1f 100644 --- a/src/es6.js +++ b/src/es6.js @@ -2,6 +2,7 @@ import Game from "./classes/game.js"; import Emitter from "./classes/emitter.js"; +import Field from "./classes/field.js"; import Entity from "./classes/entity.js"; import Vector2D from "./classes/vector2d.js"; import Sprite from "./classes/sprite.js"; @@ -13,14 +14,15 @@ import {KeyConsts} from "./classes/keyboardinput.js"; const Classes = { - Game: Game, - Emitter: Emitter, - Entity: Entity, - Sprite: Sprite, - Rect: Rect, - Vector2D: Vector2D, - Color: Color, - ImageLoader: ImageLoader + Game, + Emitter, + Field, + Entity, + Sprite, + Rect, + Vector2D, + Color, + ImageLoader }; diff --git a/src/libs/utils.js b/src/libs/utils.js new file mode 100644 index 0000000..1078453 --- /dev/null +++ b/src/libs/utils.js @@ -0,0 +1,20 @@ +class Utils { + + + static mergeIntoArray (dest, source) { + + source.forEach((item) => { + if (dest.indexOf(item) < 0) { + dest.push(item); + } + }); + + return dest; + + } + + +} + + +export default Utils; \ No newline at end of file