diff --git a/src/shattered_sword/Scenes/GameLevel.ts b/src/shattered_sword/Scenes/GameLevel.ts new file mode 100644 index 0000000..d275123 --- /dev/null +++ b/src/shattered_sword/Scenes/GameLevel.ts @@ -0,0 +1,229 @@ +import AABB from "../../Wolfie2D/DataTypes/Shapes/AABB"; +import Vec2 from "../../Wolfie2D/DataTypes/Vec2"; +import Debug from "../../Wolfie2D/Debug/Debug"; +import { GameEventType } from "../../Wolfie2D/Events/GameEventType"; +import Input from "../../Wolfie2D/Input/Input"; +import { TweenableProperties } from "../../Wolfie2D/Nodes/GameNode"; +import { GraphicType } from "../../Wolfie2D/Nodes/Graphics/GraphicTypes"; +import Point from "../../Wolfie2D/Nodes/Graphics/Point"; +import Rect from "../../Wolfie2D/Nodes/Graphics/Rect"; +import AnimatedSprite from "../../Wolfie2D/Nodes/Sprites/AnimatedSprite"; +import Label from "../../Wolfie2D/Nodes/UIElements/Label"; +import { UIElementType } from "../../Wolfie2D/Nodes/UIElements/UIElementTypes"; +import Scene from "../../Wolfie2D/Scene/Scene"; +import Timer from "../../Wolfie2D/Timing/Timer"; +import Color from "../../Wolfie2D/Utils/Color"; +import { EaseFunctionType } from "../../Wolfie2D/Utils/EaseFunctions"; +import PlayerController from "../Player/PlayerController"; +import MainMenu from "./MainMenu"; +import { Player_Events } from "../sword_enums"; + +// TODO +/** + * Add in some level music. + * This can be done here in the base GameLevel class or individual level files + */ +export default class GameLevel extends Scene { + // Every level will have a player, which will be an animated sprite + protected playerSpawn: Vec2; + protected player: AnimatedSprite; + protected respawnTimer: Timer; + + // Labels for the UI + protected static livesCount: number = 3; + protected livesCountLabel: Label; + + // Stuff to end the level and go to the next level + protected levelEndArea: Rect; + protected nextLevel: new (...args: any) => GameLevel; + protected levelEndTimer: Timer; + protected levelEndLabel: Label; + + // Screen fade in/out for level start and end + protected levelTransitionTimer: Timer; + protected levelTransitionScreen: Rect; + + startScene(): void { + + // Do the game level standard initializations + this.initLayers(); + this.initViewport(); + this.initPlayer(); + this.subscribeToEvents(); + this.addUI(); + + // Initialize the timers + this.respawnTimer = new Timer(1000, () => { + if(GameLevel.livesCount === 0){ + this.sceneManager.changeToScene(MainMenu); + } else { + this.respawnPlayer(); + this.player.enablePhysics(); + this.player.unfreeze(); + } + }); + this.levelTransitionTimer = new Timer(500); + this.levelEndTimer = new Timer(3000, () => { + // After the level end timer ends, fade to black and then go to the next scene + this.levelTransitionScreen.tweens.play("fadeIn"); + }); + + + // Start the black screen fade out + this.levelTransitionScreen.tweens.play("fadeOut"); + + // Initially disable player movement + Input.disableInput(); + } + + + updateScene(deltaT: number){ + // Handle events and update the UI if needed + while(this.receiver.hasNextEvent()){ + let event = this.receiver.getNextEvent(); + + switch(event.type){ + + } + } + + } + + /** + * Initialzes the layers + */ + protected initLayers(): void { + // Add a layer for UI + this.addUILayer("UI"); + + // Add a layer for players and enemies + this.addLayer("primary", 1); + } + + /** + * Initializes the viewport + */ + protected initViewport(): void { + this.viewport.setZoomLevel(2); + } + + /** + * Handles all subscriptions to events + */ + protected subscribeToEvents(){ + this.receiver.subscribe([ + Player_Events.PLAYER_HIT_ENEMY, + Player_Events.ENEMY_KILLED, + Player_Events.LEVEL_START, + Player_Events.LEVEL_END, + Player_Events.PLAYER_KILLED + ]); + } + + // TODO - + /** + * Adds in any necessary UI to the game + */ + protected addUI(){ + // In-game labels + + // End of level label (start off screen) + this.levelEndLabel =