Particle fields
This commit is contained in:
parent
db9e310e77
commit
7e8c4cdf12
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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
21
src/classes/field.js
Normal 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;
|
18
src/es5.js
18
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
|
||||
};
|
||||
|
||||
|
||||
|
18
src/es6.js
18
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
|
||||
};
|
||||
|
||||
|
||||
|
20
src/libs/utils.js
Normal file
20
src/libs/utils.js
Normal 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;
|
Loading…
x
Reference in New Issue
Block a user