From 6f6c6628fc30a949e3c9fd225e5512400e0a1e46 Mon Sep 17 00:00:00 2001 From: kts of kettek Date: Sat, 29 Jan 2022 17:54:53 -0800 Subject: [PATCH] Add basic zone implementation --- Engine/src/states/Game.ts | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/Engine/src/states/Game.ts b/Engine/src/states/Game.ts index dbac7fa..780c388 100644 --- a/Engine/src/states/Game.ts +++ b/Engine/src/states/Game.ts @@ -6,12 +6,23 @@ import * as planck from 'planck' import { DecorationInstance } from "../shared/decors" import { SpriteInstance, sprites } from "../shared/sprites" import { ShapeCircle, ShapePoints } from "../data/sprite" +import { SegmentZone } from "../data/segment" interface Action { type: string priority: number } +class Zone { + fixture: planck.Fixture|undefined + type: 'solid'|'fluid' + points: [number, number][] + constructor(z: SegmentZone) { + this.type = z.type + this.points = z.points.map(v=>[v[0], v[1]]) + } +} + class Entity { sprite: SpriteInstance body?: planck.Body @@ -197,10 +208,14 @@ export function GameState(ctx: ContextI): StateI { let world: planck.World = planck.World({ gravity: planck.Vec2(0, 0), }) + let worldBody: planck.Body = world.createBody({ + type: 'static', + }) let rootContainer = new PIXI.Container() let decorations: DecorationInstance[] = [] let entities: Entity[] = [] + let zones: Zone[] = [] let enter = () => { hookKeyboard() @@ -247,6 +262,10 @@ export function GameState(ctx: ContextI): StateI { rootContainer.addChild(container) } + for (let z of w.zones) { + addZone(new Zone(z)) + } + // Add bogus entity //addEntity(new PlayerEntity('animals.deer.animal.west.0'), 0, 0) addEntity(new PlayerEntity('bogus-arrows.player.normal.w.0'), 0, 0) @@ -326,7 +345,25 @@ export function GameState(ctx: ContextI): StateI { } } - let desiredActions: Action[] = [] + // Zonage + let addZone = (zone: Zone) => { + if (zones.find(v=>v===zone)) return + let shape = planck.Chain(zone.points.map(v=>planck.Vec2(v[0],v[1]))) + zone.fixture = worldBody.createFixture({ + shape: shape, + }) + if (zone.type === 'fluid') { + zone.fixture.setSensor(true) + } + } + let removeZone = (zone: Zone) => { + zones = zones.filter(v=>v!==zone) + if (zone.fixture) { + worldBody.destroyFixture(zone.fixture) + } + } + + let desiredActions: Action[] = [] let adjustAction = (type: string, v: number) => { let action = desiredActions.find(v=>v.type===type) if (!action) {