diff options
Diffstat (limited to 'src/engine/entities')
-rw-r--r-- | src/engine/entities/Curry.ts | 12 | ||||
-rw-r--r-- | src/engine/entities/EntityNames.ts | 2 | ||||
-rw-r--r-- | src/engine/entities/Grass.ts | 27 | ||||
-rw-r--r-- | src/engine/entities/Player.ts | 6 | ||||
-rw-r--r-- | src/engine/entities/Portal.ts | 60 | ||||
-rw-r--r-- | src/engine/entities/index.ts | 2 |
6 files changed, 103 insertions, 6 deletions
diff --git a/src/engine/entities/Curry.ts b/src/engine/entities/Curry.ts index bd57e19..19c5b91 100644 --- a/src/engine/entities/Curry.ts +++ b/src/engine/entities/Curry.ts @@ -3,6 +3,8 @@ import { Game } from ".."; import { BoundingBox, Colliding, Grid, Sprite } from "../components"; import { IMAGES, SPRITE_SPECS, SpriteSpec, Sprites } from "../config"; import { Coord2D } from "../interfaces"; +import { LevelNames } from "../levels"; +import { Level, SystemNames } from "../systems"; export class Curry extends Entity { private static spriteSpec: SpriteSpec = SPRITE_SPECS.get( @@ -45,9 +47,13 @@ export class Curry extends Entity { } private collisionHandler(game: Game, entity: Entity) { - if (entity.name === EntityNames.Player) { - game.removeEntity(this.id); - game.stop(); + if (entity.name !== EntityNames.Player) { + return; } + + game.removeEntity(this.id); + + const levelSystem = game.getSystem<Level>(SystemNames.Level); + levelSystem.setLevel(LevelNames.LevelSelection); } } diff --git a/src/engine/entities/EntityNames.ts b/src/engine/entities/EntityNames.ts index 056db9a..b4fbbb2 100644 --- a/src/engine/entities/EntityNames.ts +++ b/src/engine/entities/EntityNames.ts @@ -8,4 +8,6 @@ export namespace EntityNames { export const Curry = "Curry"; export const FunctionApplication = "FunctionApplication"; export const Particles = "Particles"; + export const Portal = "Portal"; + export const Grass = "Grass"; } diff --git a/src/engine/entities/Grass.ts b/src/engine/entities/Grass.ts new file mode 100644 index 0000000..70fd601 --- /dev/null +++ b/src/engine/entities/Grass.ts @@ -0,0 +1,27 @@ +import { Entity, EntityNames } from "."; +import { Grid, Sprite } from "../components"; +import { IMAGES, SPRITE_SPECS, SpriteSpec, Sprites } from "../config"; +import { Coord2D } from "../interfaces"; + +export class Grass extends Entity { + private static spriteSpec = SPRITE_SPECS.get(Sprites.GRASS) as SpriteSpec; + + constructor(gridPosition: Coord2D) { + super(EntityNames.Grass); + + this.addComponent(new Grid(gridPosition)); + + this.addComponent( + new Sprite( + IMAGES.get(Grass.spriteSpec.sheet)!, + { x: 0, y: 0 }, + { + width: Grass.spriteSpec.width, + height: Grass.spriteSpec.height, + }, + Grass.spriteSpec.msPerFrame, + Grass.spriteSpec.frames, + ), + ); + } +} diff --git a/src/engine/entities/Player.ts b/src/engine/entities/Player.ts index 1b98383..9e2e1cb 100644 --- a/src/engine/entities/Player.ts +++ b/src/engine/entities/Player.ts @@ -8,14 +8,14 @@ import { Control, Pushable, } from "../components"; -import { Direction } from "../interfaces/"; +import { Coord2D, Direction } from "../interfaces/"; export class Player extends Entity { private static spriteSpec: SpriteSpec = SPRITE_SPECS.get( Sprites.PLAYER, ) as SpriteSpec; - constructor() { + constructor(gridPosition: Coord2D) { super(EntityNames.Player); this.addComponent( @@ -33,7 +33,7 @@ export class Player extends Entity { this.addComponent(new Control()); - this.addComponent(new Grid()); + this.addComponent(new Grid(gridPosition)); this.addFacingDirectionComponents(); } diff --git a/src/engine/entities/Portal.ts b/src/engine/entities/Portal.ts new file mode 100644 index 0000000..a747aa9 --- /dev/null +++ b/src/engine/entities/Portal.ts @@ -0,0 +1,60 @@ +import { Entity, EntityNames } from "."; +import { Game } from ".."; +import { BoundingBox, Colliding, Grid, Sprite, Text } from "../components"; +import { IMAGES, SPRITE_SPECS, SpriteSpec, Sprites } from "../config"; +import { Coord2D } from "../interfaces"; +import { Level, SystemNames } from "../systems"; + +export class Portal extends Entity { + private static spriteSpec = SPRITE_SPECS.get(Sprites.PORTAL) as SpriteSpec; + + private toLevel: string; + + constructor(toLevel: string, gridPosition: Coord2D) { + super(EntityNames.Portal); + + this.toLevel = toLevel; + + this.addComponent( + new BoundingBox( + { + x: 0, + y: 0, + }, + { + width: Portal.spriteSpec.width, + height: Portal.spriteSpec.height, + }, + 0, + ), + ); + + this.addComponent( + new Sprite( + IMAGES.get(Portal.spriteSpec.sheet)!, + { x: 0, y: 0 }, + { + width: Portal.spriteSpec.width, + height: Portal.spriteSpec.height, + }, + Portal.spriteSpec.msPerFrame, + Portal.spriteSpec.frames, + ), + ); + + this.addComponent(new Colliding(this.handleCollision.bind(this))); + + this.addComponent(new Grid(gridPosition)); + + this.addComponent(new Text(toLevel)); + } + + public handleCollision(game: Game, entity: Entity) { + if (entity.name !== EntityNames.Player) { + return; + } + + const levelSystem = game.getSystem<Level>(SystemNames.Level); + levelSystem.setLevel(this.toLevel); + } +} diff --git a/src/engine/entities/index.ts b/src/engine/entities/index.ts index cb256ec..260db5b 100644 --- a/src/engine/entities/index.ts +++ b/src/engine/entities/index.ts @@ -9,3 +9,5 @@ export * from "./LockedDoor"; export * from "./Curry"; export * from "./FunctionApplication"; export * from "./Particles"; +export * from "./Portal"; +export * from "./Grass"; |