Refactor frontend to use commands

This commit is contained in:
Schmelczer András 2020-11-06 19:56:09 +01:00
parent be26ab422c
commit 503c99cb1f
25 changed files with 8031 additions and 23084 deletions

View file

@ -1,21 +1,24 @@
import { Renderer } from 'sdf-2d';
import {
Command,
CommandExecutors,
CommandReceiver,
CreateObjectsCommand,
CreatePlayerCommand,
DeleteObjectsCommand,
GameObject,
Id,
PropertyUpdatesForObjects,
RemoteCallsForObjects,
} from 'shared';
import { BeforeDestroyCommand } from '../commands/types/before-destroy';
import { StepCommand } from '../commands/types/step';
import { Game } from '../game';
import { Camera } from './camera';
import { CharacterView } from './character-view';
import { ViewObject } from './view-object';
import { Camera } from './types/camera';
import { CharacterView } from './types/character-view';
export class GameObjectContainer extends CommandReceiver {
protected objects: Map<Id, ViewObject> = new Map();
protected objects: Map<Id, GameObject> = new Map();
public player!: CharacterView;
public camera!: Camera;
@ -35,7 +38,15 @@ export class GameObjectContainer extends CommandReceiver {
},
[CreateObjectsCommand.type]: (c: CreateObjectsCommand) =>
c.objects.forEach((o) => this.addObject(o as ViewObject)),
c.objects.forEach((o) => this.addObject(o as GameObject)),
[StepCommand.type]: (c: StepCommand) => {
this.objects.forEach((o) => o.handleCommand(c));
if (this.player) {
this.camera.center = this.player.position;
}
},
[RemoteCallsForObjects.type]: (c: RemoteCallsForObjects) =>
c.callsForObjects.forEach((c) =>
@ -43,7 +54,9 @@ export class GameObjectContainer extends CommandReceiver {
),
[PropertyUpdatesForObjects.type]: (c: PropertyUpdatesForObjects) =>
c.updates.forEach((c) => this.objects.get(c.id)?.updateProperties(c.updates)),
c.updates.forEach((u) =>
u.updates.forEach((au) => this.objects.get(u.id)?.handleCommand(au)),
),
[DeleteObjectsCommand.type]: (c: DeleteObjectsCommand) =>
c.ids.forEach((id: Id) => this.deleteObject(id)),
@ -53,29 +66,17 @@ export class GameObjectContainer extends CommandReceiver {
super();
}
public stepObjects(deltaTimeInSeconds: number) {
this.objects.forEach((o) => o.step(deltaTimeInSeconds));
if (this.player) {
this.camera.center = this.player.position;
}
protected defaultCommandExecutor(c: Command) {
this.objects.forEach((o) => o.handleCommand(c));
}
public drawObjects(
renderer: Renderer,
overlay: HTMLElement,
shouldChangeLayout: boolean,
) {
this.objects.forEach((o) => o.draw(renderer, overlay, shouldChangeLayout));
}
private addObject(object: ViewObject) {
private addObject(object: GameObject) {
this.objects.set(object.id, object);
}
private deleteObject(id: Id) {
const object = this.objects.get(id);
object?.beforeDestroy();
object?.handleCommand(new BeforeDestroyCommand());
this.objects.delete(id);
}
}