diff --git a/src/client/graphics/GameRenderer.ts b/src/client/graphics/GameRenderer.ts index 33c842d8b..4ac998a28 100644 --- a/src/client/graphics/GameRenderer.ts +++ b/src/client/graphics/GameRenderer.ts @@ -21,6 +21,7 @@ import { RefreshGraphicsEvent as RedrawGraphicsEvent } from "../InputHandler"; import { GameView } from "../../core/game/GameView"; import { WinModal } from "./layers/WinModal"; import { SpawnTimer } from "./layers/SpawnTimer"; +import { OptionsMenu } from "./layers/OptionsMenu"; export function createRenderer(canvas: HTMLCanvasElement, game: GameView, eventBus: EventBus, clientID: ClientID): GameRenderer { @@ -77,11 +78,18 @@ export function createRenderer(canvas: HTMLCanvasElement, game: GameView, eventB const winModel = document.querySelector('win-modal') as WinModal - if (!(playerInfo instanceof WinModal)) { + if (!(winModel instanceof WinModal)) { console.error('win modal not found') } winModel.game = game + const optionsMenu = document.querySelector('options-menu') as OptionsMenu + if (!(optionsMenu instanceof OptionsMenu)) { + console.log('options menu not found') + } + optionsMenu.eventBus = eventBus + optionsMenu.game = game + const layers: Layer[] = [ new TerrainLayer(game), @@ -95,7 +103,8 @@ export function createRenderer(canvas: HTMLCanvasElement, game: GameView, eventB leaderboard, controlPanel, playerInfo, - winModel + winModel, + optionsMenu ] return new GameRenderer(game, eventBus, canvas, transformHandler, uiState, layers) @@ -148,16 +157,16 @@ export class GameRenderer { this.transformHandler.handleTransform(this.context) this.layers.forEach(l => { - if (l.shouldTransform()) { - l.renderLayer(this.context) + if (l.shouldTransform?.()) { + l.renderLayer?.(this.context) } }) this.context.restore() this.layers.forEach(l => { - if (!l.shouldTransform()) { - l.renderLayer(this.context) + if (!l.shouldTransform?.()) { + l.renderLayer?.(this.context) } }) @@ -170,7 +179,7 @@ export class GameRenderer { } tick() { - this.layers.forEach(l => l.tick()) + this.layers.forEach(l => l.tick?.()) } resize(width: number, height: number): void { diff --git a/src/client/graphics/layers/Layer.ts b/src/client/graphics/layers/Layer.ts index 55a3201de..08a2d4301 100644 --- a/src/client/graphics/layers/Layer.ts +++ b/src/client/graphics/layers/Layer.ts @@ -1,9 +1,9 @@ import { Game } from "../../../core/game/Game" export interface Layer { - init() - tick() - renderLayer(context: CanvasRenderingContext2D) - shouldTransform(): boolean + init?() + tick?() + renderLayer?(context: CanvasRenderingContext2D) + shouldTransform?(): boolean redraw?(): void } \ No newline at end of file diff --git a/src/client/graphics/layers/OptionsMenu.ts b/src/client/graphics/layers/OptionsMenu.ts new file mode 100644 index 000000000..e24e8b3cc --- /dev/null +++ b/src/client/graphics/layers/OptionsMenu.ts @@ -0,0 +1,119 @@ +import { LitElement, html, css } from 'lit'; +import { customElement, property, state } from 'lit/decorators.js'; +import { EventBus } from '../../../core/EventBus'; +import { PauseGameEvent } from '../../Transport'; +import { GameType } from '../../../core/game/Game'; +import { GameView } from '../../../core/game/GameView'; +import { Layer } from './Layer'; + +@customElement('options-menu') +export class OptionsMenu extends LitElement implements Layer { + public game: GameView; + public eventBus: EventBus; + + @state() + private showPauseButton: boolean = true; + + @state() + private isPaused: boolean = false; + + private isVisible = false + + private onExitButtonClick() { + window.location.reload(); + } + + private onPauseButtonClick() { + this.isPaused = !this.isPaused; + this.eventBus.emit(new PauseGameEvent(this.isPaused)); + } + + init() { + console.log('init called from OptionsMenu') + this.showPauseButton = this.game.config().gameConfig().gameType == GameType.Singleplayer; + this.isVisible = true + this.requestUpdate() + } + + tick() { + this.isVisible = true + this.requestUpdate() + } + + render() { + if (!this.isVisible) { + return html`` + } + return html` +