Particle fields
This commit is contained in:
parent
db9e310e77
commit
7e8c4cdf12
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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
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 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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
18
src/es6.js
18
src/es6.js
@ -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
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