From b011e3b38842fe2e7fc088f4ac4dcb08bc1d5c39 Mon Sep 17 00:00:00 2001 From: koneko <67551503+koneko@users.noreply.github.com> Date: Sat, 28 Sep 2024 18:05:55 +0200 Subject: [PATCH] working on actual game scene (gameplay) --- src/base/Game.ts | 28 ++++++++++++++++-- src/base/Grid.ts | 63 +++++++++++++++++++++++++++++++++++++++++ src/main.ts | 1 + src/scenes/Base.ts | 2 ++ src/scenes/GameScene.ts | 20 +++++++++++++ 5 files changed, 111 insertions(+), 3 deletions(-) create mode 100644 src/base/Grid.ts create mode 100644 src/scenes/GameScene.ts diff --git a/src/base/Game.ts b/src/base/Game.ts index b571856..924d7c9 100644 --- a/src/base/Game.ts +++ b/src/base/Game.ts @@ -1,10 +1,13 @@ import MainMenu from "../scenes/MainMenu"; import MissionMenuSelect from "../scenes/MissionSelectMenu"; +import GameScene from "../scenes/GameScene"; import GameObject from "./GameObject"; import * as PIXI from "pixi.js"; +import Scene from "../scenes/Base"; export default class Game extends GameObject { - private _currentScene: GameObject | null = null; + private _currentScene: Scene | null = null; + public ticker: PIXI.Ticker | null = null; constructor(bounds: PIXI.Rectangle) { super(bounds); @@ -23,6 +26,7 @@ export default class Game extends GameObject { const missionSelectScene = new MissionMenuSelect(this.bounds); missionSelectScene.events.on("mission", (mission) => { console.log("Mission selected", mission); + this.setScene(new GameScene(this.bounds)); }); missionSelectScene.events.on("back", () => { this.onMainMenu(); @@ -34,13 +38,31 @@ export default class Game extends GameObject { console.log("Settings"); }; - private setScene(scene: GameObject) { + private setScene(scene: Scene) { if (this._currentScene) { this.container.removeChild(this._currentScene.container); } this._currentScene = scene; + console.log(this._currentScene.constructor); this.container.addChild(scene.container); - this.drawScene(); + if (this._currentScene.constructor.name == "GameScene") { + // dont change GameScene name XD + this.ticker = new PIXI.Ticker(); + this.ticker.maxFPS = 60; + this.ticker.minFPS = 30; + this.ticker.add(this.update); + console.log(this._currentScene); + this.ticker.start(); + } else { + if (this.ticker != null) { + this.ticker.stop(); + this.ticker.destroy(); + } + } + } + + private update(time) { + this._currentScene.update(); } protected triggerBoundsChanged(): void { diff --git a/src/base/Grid.ts b/src/base/Grid.ts new file mode 100644 index 0000000..873dfe4 --- /dev/null +++ b/src/base/Grid.ts @@ -0,0 +1,63 @@ +import * as PIXI from "pixi.js"; +import GameObject from "./GameObject.ts"; + +export enum CellType { + Path, + NoBuild, + Build, + Undefined, +} + +export class Cell extends GameObject { + public type: CellType; + constructor(bounds: PIXI.Rectangle, type: CellType) { + super(bounds); + this.type = type; + } + protected triggerBoundsChanged() { + this.container.removeChildren(); + } +} + +export class Grid extends GameObject { + public rows: number; + public columns: number; + public cells: Array; + constructor(bounds: PIXI.Rectangle, rows, columns) { + super(bounds); + this.rows = rows; + this.columns = columns; + for (let y = 0; y < rows; y++) { + for (let x = 0; x < columns; x++) { + let cell = new Cell( + new PIXI.Rectangle( + x, + y, + this.gridUnitsToPixels(1), + this.gridUnitsToPixels(1) + ), + CellType.Undefined + ); + this.cells.push(cell); + } + } + } + + protected triggerBoundsChanged() { + this.container.removeChildren(); + } + + private getPixelScalingFactor() { + const pixelScaleX = this.container.width / this.columns; + const pixelScaleY = this.container.height / this.rows; + return pixelScaleX < pixelScaleY ? pixelScaleX : pixelScaleY; + } + + public gridUnitsToPixels(amount: number): number { + return amount * this.getPixelScalingFactor(); + } + + public pixelsToGridUnits(pixels: number): number { + return pixels / this.getPixelScalingFactor(); + } +} diff --git a/src/main.ts b/src/main.ts index e4abf3f..885f382 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,6 +8,7 @@ import Assets from "./base/Assets"; height: 360, resizeTo: document.body, backgroundColor: "white", + sharedTicker: true, }); document.body.appendChild(app.canvas); diff --git a/src/scenes/Base.ts b/src/scenes/Base.ts index f731867..7126780 100644 --- a/src/scenes/Base.ts +++ b/src/scenes/Base.ts @@ -9,4 +9,6 @@ export default abstract class Scene extends GameObject { this.createScene(); } protected abstract createScene(); + + public update() {} } diff --git a/src/scenes/GameScene.ts b/src/scenes/GameScene.ts new file mode 100644 index 0000000..6e11186 --- /dev/null +++ b/src/scenes/GameScene.ts @@ -0,0 +1,20 @@ +import Button from "../base/Button"; +import Scene from "./Base"; +import * as PIXI from "pixi.js"; + +export default class GameScene extends Scene { + private grid; + // DO NOT CHANGE NAME, WILL BREAK Game.ts + constructor(bounds: PIXI.Rectangle) { + super(bounds); + } + + public update() {} + + protected createScene() { + console.log("Creating Game Scene ", this.bounds); + this.container.removeChildren(); + this.container.x = this.bounds.x; + this.container.y = this.bounds.y; + } +}