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) { constructor (x, y) {
super(x, y, 1, 1, new MomentumEngine.Classes.Color(255, 255, 255, 0)); super(x, y, 1, 1, new MomentumEngine.Classes.Color(255, 255, 255, 0));
this.timeToLive = 5000; this.timeToLive = 15000;
} }
update (delta) { 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), 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); let mainScene = new MomentumEngine.Classes.Rect(0, 0, width, height, black);
particles.addChildEntity(mainScene); 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); 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); mainScene.addChildEntity(rect);
rect.addChildEntity(emitter); rect.addChildEntity(emitter);
mainScene.addChildEntity(fieldRect);
fieldRect.addChildEntity(field);
mainScene.addChildEntity(fieldRect2);
fieldRect2.addChildEntity(field2);
rect.update = function (delta) { rect.update = function (delta) {
if (particles.inputs.keyboard.isPressed(KeyConsts.UP)) { if (particles.inputs.keyboard.isPressed(KeyConsts.UP)) {
@ -69,6 +81,8 @@ window.onload = function () {
}; };
emitter.setParticleParent(mainScene); emitter.setParticleParent(mainScene);
emitter.particleFields.push(field, field2);
//emitter.spread = Math.PI / 32;
emitter.emitting = true; emitter.emitting = true;
particles.start(); particles.start();

View File

@ -3,6 +3,8 @@
import Entity from "./entity.js"; import Entity from "./entity.js";
import Vector2D from "./vector2d.js"; import Vector2D from "./vector2d.js";
import Utils from "../libs/utils";
class Emitter extends Entity { class Emitter extends Entity {
@ -13,6 +15,7 @@ class Emitter extends Entity {
this.particleVelocity = velocity; this.particleVelocity = velocity;
this.particleClass = particle; this.particleClass = particle;
this.particleFields = [];
this.rate = rate; this.rate = rate;
this.emitting = false; this.emitting = false;
@ -41,6 +44,7 @@ class Emitter extends Entity {
let particle = new ParticleClass(this._calculatedPos.x, this._calculatedPos.y); let particle = new ParticleClass(this._calculatedPos.x, this._calculatedPos.y);
particle.velocity = velocity; particle.velocity = velocity;
Utils.mergeIntoArray(particle.fields, this.particleFields);
//this._particles.push(particle); //this._particles.push(particle);
parent.addChildEntity(particle); parent.addChildEntity(particle);

View File

@ -11,6 +11,8 @@ class Entity {
this.velocity = new Vector2D(0, 0); this.velocity = new Vector2D(0, 0);
this.acceleration = new Vector2D(0, 0); this.acceleration = new Vector2D(0, 0);
this.fields = [];
this.state = {}; this.state = {};
this.children = []; 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) { _updateEntity (delta) {
if (this.timeToLive) { if (this.timeToLive) {
@ -139,12 +168,9 @@ class Entity {
} }
// Calculate new position based on velocity and acceleration if there's one set // Calculate new position based on velocity and acceleration if there's one set
if (this.velocity) { if (this.velocity && (this.velocity.x !== 0 || this.velocity.y !== 0)) {
if (this.acceleration) {
this.velocity.add(this.acceleration);
}
this.velocity.add(this._calculateFields(delta));
this.pos.add(this.velocity.clone().multiply(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 Game from "./classes/game.js";
import Emitter from "./classes/emitter.js"; import Emitter from "./classes/emitter.js";
import Field from "./classes/field.js";
import Entity from "./classes/entity.js"; import Entity from "./classes/entity.js";
import Vector2D from "./classes/vector2d.js"; import Vector2D from "./classes/vector2d.js";
import Sprite from "./classes/sprite.js"; import Sprite from "./classes/sprite.js";
@ -13,14 +14,15 @@ import {KeyConsts} from "./classes/keyboardinput.js";
const Classes = { const Classes = {
Game: Game, Game,
Emitter: Emitter, Emitter,
Entity: Entity, Field,
Sprite: Sprite, Entity,
Rect: Rect, Sprite,
Vector2D: Vector2D, Rect,
Color: Color, Vector2D,
ImageLoader: ImageLoader Color,
ImageLoader
}; };

View File

@ -2,6 +2,7 @@
import Game from "./classes/game.js"; import Game from "./classes/game.js";
import Emitter from "./classes/emitter.js"; import Emitter from "./classes/emitter.js";
import Field from "./classes/field.js";
import Entity from "./classes/entity.js"; import Entity from "./classes/entity.js";
import Vector2D from "./classes/vector2d.js"; import Vector2D from "./classes/vector2d.js";
import Sprite from "./classes/sprite.js"; import Sprite from "./classes/sprite.js";
@ -13,14 +14,15 @@ import {KeyConsts} from "./classes/keyboardinput.js";
const Classes = { const Classes = {
Game: Game, Game,
Emitter: Emitter, Emitter,
Entity: Entity, Field,
Sprite: Sprite, Entity,
Rect: Rect, Sprite,
Vector2D: Vector2D, Rect,
Color: Color, Vector2D,
ImageLoader: ImageLoader 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;