import { Entity, EntityNames } from "."; import { IMAGES, SPRITE_SPECS, Sprites, type SpriteSpec } from "../config"; import { Jump, FacingDirection, BoundingBox, Sprite, Velocity, Gravity, WallBounded, Forces, Collide, Control, Mass, Moment, } from "../components"; import { Direction } from "../interfaces"; export class Player extends Entity { private static MASS: number = 10; private static MOI: number = 100; private static spriteSpec: SpriteSpec = SPRITE_SPECS.get( Sprites.COFFEE, ) as SpriteSpec; constructor(playerId: string) { super(EntityNames.Player); this.addComponent( new BoundingBox( { x: 300, y: 100, }, { width: Player.spriteSpec.width, height: Player.spriteSpec.height }, 0, ), ); this.addComponent( new Velocity({ dCartesian: { dx: 0, dy: 0 }, dTheta: 0 }), ); this.addComponent(new Mass(Player.MASS)); this.addComponent(new Moment(Player.MOI)); this.addComponent(new Forces()); this.addComponent(new Gravity()); this.addComponent(new Jump()); this.addComponent(new Control(playerId)); this.addComponent(new Collide()); this.addComponent(new WallBounded()); this.addFacingDirectionComponents(); } private addFacingDirectionComponents() { const [leftSprite, rightSprite] = [Direction.LEFT, Direction.RIGHT].map( (direction) => new Sprite( IMAGES.get(Player.spriteSpec.states?.get(direction)?.sheet as string), { x: 0, y: 0 }, { width: Player.spriteSpec.width, height: Player.spriteSpec.height }, Player.spriteSpec.msPerFrame, Player.spriteSpec.frames, ), ); this.addComponent(new FacingDirection(leftSprite, rightSprite)); this.addComponent(leftSprite); // face Left by default } }