summaryrefslogtreecommitdiff
path: root/engine/entities/Player.ts
diff options
context:
space:
mode:
Diffstat (limited to 'engine/entities/Player.ts')
-rw-r--r--engine/entities/Player.ts67
1 files changed, 51 insertions, 16 deletions
diff --git a/engine/entities/Player.ts b/engine/entities/Player.ts
index 45d7500..4d91c6f 100644
--- a/engine/entities/Player.ts
+++ b/engine/entities/Player.ts
@@ -1,5 +1,5 @@
-import { Entity } from ".";
-import { IMAGES, SPRITE_SPECS, Sprites, type SpriteSpec } from "../config";
+import { Entity, EntityNames } from '.';
+import { IMAGES, SPRITE_SPECS, Sprites, type SpriteSpec } from '../config';
import {
Jump,
FacingDirection,
@@ -10,32 +10,38 @@ import {
WallBounded,
Forces,
Collide,
- Control,
Mass,
Moment,
-} from "../components";
-import { Direction } from "../interfaces";
+ ComponentNames,
+ Control
+} from '../components';
+import { Direction } from '../interfaces';
export class Player extends Entity {
private static MASS: number = 10;
- private static MOI: number = 1000;
+ private static MOI: number = 100;
private static spriteSpec: SpriteSpec = SPRITE_SPECS.get(
- Sprites.COFFEE,
+ Sprites.COFFEE
) as SpriteSpec;
constructor() {
- super();
+ super(EntityNames.Player);
this.addComponent(
new BoundingBox(
- { x: 300, y: 100 },
+ {
+ x: 0,
+ y: 0
+ },
{ width: Player.spriteSpec.width, height: Player.spriteSpec.height },
- 0,
- ),
+ 0
+ )
);
- this.addComponent(new Velocity({ dx: 0, dy: 0 }, 0));
+ this.addComponent(
+ new Velocity({ dCartesian: { dx: 0, dy: 0 }, dTheta: 0 })
+ );
this.addComponent(new Mass(Player.MASS));
this.addComponent(new Moment(Player.MOI));
@@ -43,7 +49,6 @@ export class Player extends Entity {
this.addComponent(new Gravity());
this.addComponent(new Jump());
- this.addComponent(new Control());
this.addComponent(new Collide());
this.addComponent(new WallBounded());
@@ -59,11 +64,41 @@ export class Player extends Entity {
{ x: 0, y: 0 },
{ width: Player.spriteSpec.width, height: Player.spriteSpec.height },
Player.spriteSpec.msPerFrame,
- Player.spriteSpec.frames,
- ),
+ Player.spriteSpec.frames
+ )
);
this.addComponent(new FacingDirection(leftSprite, rightSprite));
- this.addComponent(leftSprite); // face Left by default
+ this.addComponent(leftSprite); // face left by default
+ }
+
+ public serialize(): Record<string, any> {
+ return {
+ control: this.getComponent<Control>(ComponentNames.Control),
+ boundingBox: this.getComponent<BoundingBox>(ComponentNames.BoundingBox),
+ velocity: this.getComponent<Velocity>(ComponentNames.Velocity),
+ forces: this.getComponent<Forces>(ComponentNames.Forces)
+ };
+ }
+
+ public setFrom(args: Record<string, any>) {
+ const { control, velocity, forces, boundingBox } = args;
+
+ let center = boundingBox.center;
+
+ const myCenter = this.getComponent<BoundingBox>(
+ ComponentNames.BoundingBox
+ ).center;
+ const distance = Math.sqrt(
+ Math.pow(center.y - myCenter.y, 2) + Math.pow(center.x - myCenter.x, 2)
+ );
+ if (distance < 30) center = myCenter;
+
+ [
+ Object.assign(new Control(control.controllableBy), control),
+ new Velocity(velocity.velocity),
+ new Forces(forces.forces),
+ new BoundingBox(center, boundingBox.dimension, boundingBox.rotation)
+ ].forEach((component) => this.addComponent(component));
}
}