Particle fields

This commit is contained in:
Nathan Kunicki 2016-02-14 15:44:12 +00:00
parent db9e310e77
commit 7e8c4cdf12
7 changed files with 114 additions and 25 deletions

View File

@ -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();

View File

@ -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);

View File

@ -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));
}

21
src/classes/field.js Normal file
View File

@ -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;

View File

@ -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
};

View File

@ -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
};

20
src/libs/utils.js Normal file
View File

@ -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;