added enums for event type and added an emitter class
This commit is contained in:
parent
d452678344
commit
a67521ea26
20
src/Events/Emitter.ts
Normal file
20
src/Events/Emitter.ts
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import Map from "../DataTypes/Map";
|
||||||
|
import EventQueue from "./EventQueue";
|
||||||
|
import GameEvent from "./GameEvent";
|
||||||
|
|
||||||
|
export default class Emitter {
|
||||||
|
private eventQueue: EventQueue;
|
||||||
|
|
||||||
|
constructor(){
|
||||||
|
this.eventQueue = EventQueue.getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Emit and event of type eventType with the data packet data
|
||||||
|
* @param eventType
|
||||||
|
* @param data
|
||||||
|
*/
|
||||||
|
fireEvent(eventType: string, data: Map<any> | Record<string, any> = null): void {
|
||||||
|
this.eventQueue.addEvent(new GameEvent(eventType, data));
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ import Queue from "../DataTypes/Queue";
|
||||||
import Map from "../DataTypes/Map";
|
import Map from "../DataTypes/Map";
|
||||||
import GameEvent from "./GameEvent";
|
import GameEvent from "./GameEvent";
|
||||||
import Receiver from "./Receiver";
|
import Receiver from "./Receiver";
|
||||||
|
import { GameEventType } from "./GameEventType";
|
||||||
|
|
||||||
export default class EventQueue {
|
export default class EventQueue {
|
||||||
private static instance: EventQueue = null;
|
private static instance: EventQueue = null;
|
||||||
|
@ -65,8 +66,8 @@ export default class EventQueue {
|
||||||
}
|
}
|
||||||
|
|
||||||
// If a receiver is subscribed to all events, send it the event
|
// If a receiver is subscribed to all events, send it the event
|
||||||
if(this.receivers.has("all")){
|
if(this.receivers.has(GameEventType.ALL)){
|
||||||
for(let receiver of this.receivers.get("all")){
|
for(let receiver of this.receivers.get(GameEventType.ALL)){
|
||||||
receiver.receive(event);
|
receiver.receive(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
59
src/Events/GameEventType.ts
Normal file
59
src/Events/GameEventType.ts
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
export enum GameEventType {
|
||||||
|
/**
|
||||||
|
* Mouse Down event. Has data: {position: Vec2 - Mouse Position}
|
||||||
|
*/
|
||||||
|
MOUSE_DOWN = "mouse_down",
|
||||||
|
/**
|
||||||
|
* Mouse Up event. Has data: {position: Vec2 - Mouse Position}
|
||||||
|
*/
|
||||||
|
MOUSE_UP = "mouse_up",
|
||||||
|
/**
|
||||||
|
* Mouse Move event. Has data: {position: Vec2 - Mouse Position}
|
||||||
|
*/
|
||||||
|
MOUSE_MOVE = "mouse_move",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Key Down event. Has data: {key: string - The key that is down}
|
||||||
|
*/
|
||||||
|
KEY_DOWN = "key_down",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Key Up event. Has data: {key: string - The key that is up}
|
||||||
|
*/
|
||||||
|
KEY_UP = "key_up",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Canvas Blur event. Has data: {}
|
||||||
|
*/
|
||||||
|
CANVAS_BLUR = "canvas_blur",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start Recording event. Has data: {}
|
||||||
|
*/
|
||||||
|
START_RECORDING = "start_recording",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop Recording event. Has data: {}
|
||||||
|
*/
|
||||||
|
STOP_RECORDING = "stop_recording",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Play Recording event. Has data: {}
|
||||||
|
*/
|
||||||
|
PLAY_RECORDING = "play_recording",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Play Sound event. Has data: {key: string, loop: boolean, holdReference: boolean }
|
||||||
|
*/
|
||||||
|
PLAY_SOUND = "play_sound",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Play Sound event. Has data: {key: string}
|
||||||
|
*/
|
||||||
|
STOP_SOUND = "stop_sound",
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encompasses all event types. Used for receivers only.
|
||||||
|
*/
|
||||||
|
ALL = "all",
|
||||||
|
}
|
|
@ -1,6 +1,7 @@
|
||||||
import EventQueue from "../Events/EventQueue";
|
import EventQueue from "../Events/EventQueue";
|
||||||
import Vec2 from "../DataTypes/Vec2";
|
import Vec2 from "../DataTypes/Vec2";
|
||||||
import GameEvent from "../Events/GameEvent";
|
import GameEvent from "../Events/GameEvent";
|
||||||
|
import { GameEventType } from "../Events/GameEventType";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles communication with the web browser to receive asynchronous events and send them to the event queue
|
* Handles communication with the web browser to receive asynchronous events and send them to the event queue
|
||||||
|
@ -23,36 +24,36 @@ export default class InputHandler{
|
||||||
|
|
||||||
private handleMouseDown = (event: MouseEvent, canvas: HTMLCanvasElement): void => {
|
private handleMouseDown = (event: MouseEvent, canvas: HTMLCanvasElement): void => {
|
||||||
let pos = this.getMousePosition(event, canvas);
|
let pos = this.getMousePosition(event, canvas);
|
||||||
let gameEvent = new GameEvent("mouse_down", {position: pos});
|
let gameEvent = new GameEvent(GameEventType.MOUSE_DOWN, {position: pos});
|
||||||
this.eventQueue.addEvent(gameEvent);
|
this.eventQueue.addEvent(gameEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleMouseUp = (event: MouseEvent, canvas: HTMLCanvasElement): void => {
|
private handleMouseUp = (event: MouseEvent, canvas: HTMLCanvasElement): void => {
|
||||||
let pos = this.getMousePosition(event, canvas);
|
let pos = this.getMousePosition(event, canvas);
|
||||||
let gameEvent = new GameEvent("mouse_up", {position: pos});
|
let gameEvent = new GameEvent(GameEventType.MOUSE_UP, {position: pos});
|
||||||
this.eventQueue.addEvent(gameEvent);
|
this.eventQueue.addEvent(gameEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleMouseMove = (event: MouseEvent, canvas: HTMLCanvasElement): void => {
|
private handleMouseMove = (event: MouseEvent, canvas: HTMLCanvasElement): void => {
|
||||||
let pos = this.getMousePosition(event, canvas);
|
let pos = this.getMousePosition(event, canvas);
|
||||||
let gameEvent = new GameEvent("mouse_move", {position: pos});
|
let gameEvent = new GameEvent(GameEventType.MOUSE_MOVE, {position: pos});
|
||||||
this.eventQueue.addEvent(gameEvent);
|
this.eventQueue.addEvent(gameEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleKeyDown = (event: KeyboardEvent): void => {
|
private handleKeyDown = (event: KeyboardEvent): void => {
|
||||||
let key = this.getKey(event);
|
let key = this.getKey(event);
|
||||||
let gameEvent = new GameEvent("key_down", {key: key});
|
let gameEvent = new GameEvent(GameEventType.KEY_DOWN, {key: key});
|
||||||
this.eventQueue.addEvent(gameEvent);
|
this.eventQueue.addEvent(gameEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleKeyUp = (event: KeyboardEvent): void => {
|
private handleKeyUp = (event: KeyboardEvent): void => {
|
||||||
let key = this.getKey(event);
|
let key = this.getKey(event);
|
||||||
let gameEvent = new GameEvent("key_up", {key: key});
|
let gameEvent = new GameEvent(GameEventType.KEY_UP, {key: key});
|
||||||
this.eventQueue.addEvent(gameEvent);
|
this.eventQueue.addEvent(gameEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private handleBlur = (event: Event): void => {
|
private handleBlur = (event: Event): void => {
|
||||||
let gameEvent = new GameEvent("canvas_blur", {});
|
let gameEvent = new GameEvent(GameEventType.CANVAS_BLUR, {});
|
||||||
this.eventQueue.addEvent(gameEvent);
|
this.eventQueue.addEvent(gameEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@ import Map from "../DataTypes/Map";
|
||||||
import Vec2 from "../DataTypes/Vec2";
|
import Vec2 from "../DataTypes/Vec2";
|
||||||
import EventQueue from "../Events/EventQueue";
|
import EventQueue from "../Events/EventQueue";
|
||||||
import Viewport from "../SceneGraph/Viewport";
|
import Viewport from "../SceneGraph/Viewport";
|
||||||
|
import GameEvent from "../Events/GameEvent";
|
||||||
|
import { GameEventType } from "../Events/GameEventType";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Receives input events from the event queue and allows for easy access of information about input
|
* Receives input events from the event queue and allows for easy access of information about input
|
||||||
|
@ -31,7 +33,8 @@ export default class InputReceiver{
|
||||||
|
|
||||||
this.eventQueue = EventQueue.getInstance();
|
this.eventQueue = EventQueue.getInstance();
|
||||||
// Subscribe to all input events
|
// Subscribe to all input events
|
||||||
this.eventQueue.subscribe(this.receiver, ["mouse_down", "mouse_up", "mouse_move", "key_down", "key_up", "canvas_blur"]);
|
this.eventQueue.subscribe(this.receiver, [GameEventType.MOUSE_DOWN, GameEventType.MOUSE_UP, GameEventType.MOUSE_MOVE,
|
||||||
|
GameEventType.KEY_DOWN, GameEventType.KEY_UP, GameEventType.CANVAS_BLUR]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static getInstance(): InputReceiver{
|
static getInstance(): InputReceiver{
|
||||||
|
@ -50,21 +53,21 @@ export default class InputReceiver{
|
||||||
let event = this.receiver.getNextEvent();
|
let event = this.receiver.getNextEvent();
|
||||||
|
|
||||||
// Handle each event type
|
// Handle each event type
|
||||||
if(event.type === "mouse_down"){
|
if(event.type === GameEventType.MOUSE_DOWN){
|
||||||
this.mouseJustPressed = true;
|
this.mouseJustPressed = true;
|
||||||
this.mousePressed = true;
|
this.mousePressed = true;
|
||||||
this.mousePressPosition = event.data.get("position");
|
this.mousePressPosition = event.data.get("position");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(event.type === "mouse_up"){
|
if(event.type === GameEventType.MOUSE_UP){
|
||||||
this.mousePressed = false;
|
this.mousePressed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(event.type === "mouse_move"){
|
if(event.type === GameEventType.MOUSE_MOVE){
|
||||||
this.mousePosition = event.data.get("position");
|
this.mousePosition = event.data.get("position");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(event.type === "key_down"){
|
if(event.type === GameEventType.KEY_DOWN){
|
||||||
let key = event.data.get("key")
|
let key = event.data.get("key")
|
||||||
if(!this.keyPressed.get(key)){
|
if(!this.keyPressed.get(key)){
|
||||||
this.keyJustPressed.set(key, true);
|
this.keyJustPressed.set(key, true);
|
||||||
|
@ -72,12 +75,12 @@ export default class InputReceiver{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(event.type === "key_up"){
|
if(event.type === GameEventType.KEY_UP){
|
||||||
let key = event.data.get("key")
|
let key = event.data.get("key")
|
||||||
this.keyPressed.set(key, false);
|
this.keyPressed.set(key, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(event.type === "canvas_blur"){
|
if(event.type === GameEventType.CANVAS_BLUR){
|
||||||
this.clearKeyPresses()
|
this.clearKeyPresses()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ import UIElement from "./Nodes/UIElement";
|
||||||
import Button from "./Nodes/UIElements/Button";
|
import Button from "./Nodes/UIElements/Button";
|
||||||
import Layer from "./Scene/Layer";
|
import Layer from "./Scene/Layer";
|
||||||
import SecondScene from "./SecondScene";
|
import SecondScene from "./SecondScene";
|
||||||
import GameEvent from "./Events/GameEvent";
|
import { GameEventType } from "./Events/GameEventType";
|
||||||
|
|
||||||
export default class MainScene extends Scene {
|
export default class MainScene extends Scene {
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ export default class MainScene extends Scene {
|
||||||
backgroundTilemap.getLayer().setAlpha(0.5);
|
backgroundTilemap.getLayer().setAlpha(0.5);
|
||||||
|
|
||||||
// Add the music and start playing it on a loop
|
// Add the music and start playing it on a loop
|
||||||
this.emit("play_sound", {key: "level_music", loop: true, holdReference: true});
|
this.emitter.fireEvent(GameEventType.PLAY_SOUND, {key: "level_music", loop: true, holdReference: true});
|
||||||
|
|
||||||
// Add the tilemap
|
// Add the tilemap
|
||||||
this.add.tilemap("platformer", OrthogonalTilemap);
|
this.add.tilemap("platformer", OrthogonalTilemap);
|
||||||
|
@ -65,19 +65,19 @@ export default class MainScene extends Scene {
|
||||||
recordButton.setSize(100, 50);
|
recordButton.setSize(100, 50);
|
||||||
recordButton.setText("Record");
|
recordButton.setText("Record");
|
||||||
recordButton.setPosition(400, 30);
|
recordButton.setPosition(400, 30);
|
||||||
recordButton.onClickEventId = "record_button_press";
|
recordButton.onClickEventId = GameEventType.START_RECORDING;
|
||||||
|
|
||||||
let stopButton = this.add.uiElement(Button, uiLayer);
|
let stopButton = this.add.uiElement(Button, uiLayer);
|
||||||
stopButton.setSize(100, 50);
|
stopButton.setSize(100, 50);
|
||||||
stopButton.setText("Stop");
|
stopButton.setText("Stop");
|
||||||
stopButton.setPosition(550, 30);
|
stopButton.setPosition(550, 30);
|
||||||
stopButton.onClickEventId = "stop_button_press";
|
stopButton.onClickEventId = GameEventType.STOP_RECORDING;
|
||||||
|
|
||||||
let playButton = this.add.uiElement(Button, uiLayer);
|
let playButton = this.add.uiElement(Button, uiLayer);
|
||||||
playButton.setSize(100, 50);
|
playButton.setSize(100, 50);
|
||||||
playButton.setText("Play");
|
playButton.setText("Play");
|
||||||
playButton.setPosition(700, 30);
|
playButton.setPosition(700, 30);
|
||||||
playButton.onClickEventId = "play_button_press";
|
playButton.onClickEventId = GameEventType.PLAY_RECORDING;
|
||||||
|
|
||||||
let cycleFramerateButton = this.add.uiElement(Button, uiLayer);
|
let cycleFramerateButton = this.add.uiElement(Button, uiLayer);
|
||||||
cycleFramerateButton.setSize(150, 50);
|
cycleFramerateButton.setSize(150, 50);
|
||||||
|
@ -123,7 +123,7 @@ export default class MainScene extends Scene {
|
||||||
switchButton.setText("Change Scene");
|
switchButton.setText("Change Scene");
|
||||||
switchButton.setPosition(340, 190);
|
switchButton.setPosition(340, 190);
|
||||||
switchButton.onClick = () => {
|
switchButton.onClick = () => {
|
||||||
this.emit("stop_sound", {key: "level_music"});
|
this.emitter.fireEvent(GameEventType.STOP_SOUND, {key: "level_music"});
|
||||||
this.sceneManager.changeScene(SecondScene);
|
this.sceneManager.changeScene(SecondScene);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,27 +1,27 @@
|
||||||
import EventQueue from "../Events/EventQueue";
|
import EventQueue from "../Events/EventQueue";
|
||||||
import InputReceiver from "../Input/InputReceiver";
|
import InputReceiver from "../Input/InputReceiver";
|
||||||
import Vec2 from "../DataTypes/Vec2";
|
import Vec2 from "../DataTypes/Vec2";
|
||||||
import Map from "../DataTypes/Map";
|
|
||||||
import Receiver from "../Events/Receiver";
|
import Receiver from "../Events/Receiver";
|
||||||
import GameEvent from "../Events/GameEvent";
|
import Emitter from "../Events/Emitter";
|
||||||
import Scene from "../Scene/Scene";
|
import Scene from "../Scene/Scene";
|
||||||
import Layer from "../Scene/Layer";
|
import Layer from "../Scene/Layer";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The representation of an object in the game world
|
* The representation of an object in the game world
|
||||||
*/
|
*/
|
||||||
export default abstract class GameNode{
|
export default abstract class GameNode {
|
||||||
private eventQueue: EventQueue;
|
|
||||||
protected input: InputReceiver;
|
protected input: InputReceiver;
|
||||||
protected position: Vec2;
|
protected position: Vec2;
|
||||||
private receiver: Receiver;
|
protected receiver: Receiver;
|
||||||
|
protected emitter: Emitter;
|
||||||
protected scene: Scene;
|
protected scene: Scene;
|
||||||
protected layer: Layer;
|
protected layer: Layer;
|
||||||
|
|
||||||
constructor(){
|
constructor(){
|
||||||
this.eventQueue = EventQueue.getInstance();
|
|
||||||
this.input = InputReceiver.getInstance();
|
this.input = InputReceiver.getInstance();
|
||||||
this.position = new Vec2(0, 0);
|
this.position = new Vec2(0, 0);
|
||||||
|
this.receiver = new Receiver();
|
||||||
|
this.emitter = new Emitter();
|
||||||
}
|
}
|
||||||
|
|
||||||
setScene(scene: Scene): void {
|
setScene(scene: Scene): void {
|
||||||
|
@ -52,24 +52,6 @@ export default abstract class GameNode{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Subscribe this object's receiver to the specified event type
|
|
||||||
* @param eventType
|
|
||||||
*/
|
|
||||||
subscribe(eventType: string): void {
|
|
||||||
this.eventQueue.subscribe(this.receiver, eventType);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Emit and event of type eventType with the data packet data
|
|
||||||
* @param eventType
|
|
||||||
* @param data
|
|
||||||
*/
|
|
||||||
emit(eventType: string, data: Map<any> | Record<string, any> = null): void {
|
|
||||||
let event = new GameEvent(eventType, data);
|
|
||||||
this.eventQueue.addEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO - This doesn't seem ideal. Is there a better way to do this?
|
// TODO - This doesn't seem ideal. Is there a better way to do this?
|
||||||
protected getViewportOriginWithParallax(): Vec2 {
|
protected getViewportOriginWithParallax(): Vec2 {
|
||||||
return this.scene.getViewport().getPosition().clone().mult(this.layer.getParallax());
|
return this.scene.getViewport().getPosition().clone().mult(this.layer.getParallax());
|
||||||
|
|
|
@ -82,7 +82,7 @@ export default class UIElement extends CanvasNode{
|
||||||
}
|
}
|
||||||
if(this.onClickEventId !== null){
|
if(this.onClickEventId !== null){
|
||||||
let data = {};
|
let data = {};
|
||||||
this.emit(this.onClickEventId, data);
|
this.emitter.fireEvent(this.onClickEventId, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ export default class UIElement extends CanvasNode{
|
||||||
}
|
}
|
||||||
if(this.onEnterEventId !== null){
|
if(this.onEnterEventId !== null){
|
||||||
let data = {};
|
let data = {};
|
||||||
this.emit(this.onEnterEventId, data);
|
this.emitter.fireEvent(this.onEnterEventId, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if(this.isEntered) {
|
} else if(this.isEntered) {
|
||||||
|
@ -115,7 +115,7 @@ export default class UIElement extends CanvasNode{
|
||||||
}
|
}
|
||||||
if(this.onLeaveEventId !== null){
|
if(this.onLeaveEventId !== null){
|
||||||
let data = {};
|
let data = {};
|
||||||
this.emit(this.onLeaveEventId, data);
|
this.emitter.fireEvent(this.onLeaveEventId, data);
|
||||||
}
|
}
|
||||||
} else if(this.isClicked) {
|
} else if(this.isClicked) {
|
||||||
// If mouse is dragged off of element while down, it is not clicked anymore
|
// If mouse is dragged off of element while down, it is not clicked anymore
|
||||||
|
|
|
@ -2,6 +2,7 @@ import Queue from "../DataTypes/Queue";
|
||||||
import Receiver from "../Events/Receiver";
|
import Receiver from "../Events/Receiver";
|
||||||
import GameEvent from "../Events/GameEvent";
|
import GameEvent from "../Events/GameEvent";
|
||||||
import EventQueue from "../Events/EventQueue";
|
import EventQueue from "../Events/EventQueue";
|
||||||
|
import { GameEventType } from "../Events/GameEventType";
|
||||||
|
|
||||||
export default class Recorder{
|
export default class Recorder{
|
||||||
private receiver: Receiver;
|
private receiver: Receiver;
|
||||||
|
@ -53,7 +54,7 @@ export default class Recorder{
|
||||||
while(this.receiver.hasNextEvent()){
|
while(this.receiver.hasNextEvent()){
|
||||||
let event = this.receiver.getNextEvent();
|
let event = this.receiver.getNextEvent();
|
||||||
|
|
||||||
if(event.type === "stop_button_press"){
|
if(event.type === GameEventType.STOP_RECORDING){
|
||||||
this.recording = false;
|
this.recording = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,13 +62,13 @@ export default class Recorder{
|
||||||
this.log.enqueue(new LogItem(this.frame, deltaT, event));
|
this.log.enqueue(new LogItem(this.frame, deltaT, event));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(event.type === "record_button_press"){
|
if(event.type === GameEventType.START_RECORDING){
|
||||||
this.log.clear();
|
this.log.clear();
|
||||||
this.recording = true;
|
this.recording = true;
|
||||||
this.frame = 0
|
this.frame = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
if(event.type === "play_button_press"){
|
if(event.type === GameEventType.PLAY_RECORDING){
|
||||||
this.frame = 0;
|
this.frame = 0;
|
||||||
this.recording = false;
|
this.recording = false;
|
||||||
this.playing = true;
|
this.playing = true;
|
||||||
|
|
|
@ -3,6 +3,7 @@ import Vec2 from "./DataTypes/Vec2";
|
||||||
import Debug from "./Debug/Debug";
|
import Debug from "./Debug/Debug";
|
||||||
import AABB from "./Physics/Colliders/AABB";
|
import AABB from "./Physics/Colliders/AABB";
|
||||||
import CanvasNode from "./Nodes/CanvasNode";
|
import CanvasNode from "./Nodes/CanvasNode";
|
||||||
|
import { GameEventType } from "./Events/GameEventType";
|
||||||
|
|
||||||
export default class Player extends PhysicsNode {
|
export default class Player extends PhysicsNode {
|
||||||
velocity: Vec2;
|
velocity: Vec2;
|
||||||
|
@ -83,7 +84,7 @@ export default class Player extends PhysicsNode {
|
||||||
if(this.grounded){
|
if(this.grounded){
|
||||||
if(dir.y === -1){
|
if(dir.y === -1){
|
||||||
// Jumping
|
// Jumping
|
||||||
this.emit("play_sound", {key: "player_jump"});
|
this.emitter.fireEvent(GameEventType.PLAY_SOUND, {key: "player_jump"});
|
||||||
}
|
}
|
||||||
vel.y = dir.y*1800;
|
vel.y = dir.y*1800;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,8 @@ import Tilemap from "../Nodes/Tilemap";
|
||||||
import ResourceManager from "../ResourceManager/ResourceManager";
|
import ResourceManager from "../ResourceManager/ResourceManager";
|
||||||
import GameLoop from "../Loop/GameLoop";
|
import GameLoop from "../Loop/GameLoop";
|
||||||
import SceneManager from "./SceneManager";
|
import SceneManager from "./SceneManager";
|
||||||
import EventQueue from "../Events/EventQueue";
|
import Receiver from "../Events/Receiver";
|
||||||
import GameEvent from "../Events/GameEvent";
|
import Emitter from "../Events/Emitter";
|
||||||
import Map from "../DataTypes/Map";
|
|
||||||
|
|
||||||
export default class Scene{
|
export default class Scene{
|
||||||
protected layers: Stack<Layer>;
|
protected layers: Stack<Layer>;
|
||||||
|
@ -21,6 +20,8 @@ export default class Scene{
|
||||||
protected running: boolean;
|
protected running: boolean;
|
||||||
protected game: GameLoop;
|
protected game: GameLoop;
|
||||||
protected sceneManager: SceneManager;
|
protected sceneManager: SceneManager;
|
||||||
|
protected receiver: Receiver;
|
||||||
|
protected emitter: Emitter;
|
||||||
|
|
||||||
protected tilemaps: Array<Tilemap>;
|
protected tilemaps: Array<Tilemap>;
|
||||||
|
|
||||||
|
@ -48,6 +49,8 @@ export default class Scene{
|
||||||
this.running = false;
|
this.running = false;
|
||||||
this.game = game;
|
this.game = game;
|
||||||
this.sceneManager = sceneManager;
|
this.sceneManager = sceneManager;
|
||||||
|
this.receiver = new Receiver();
|
||||||
|
this.emitter = new Emitter();
|
||||||
|
|
||||||
this.tilemaps = new Array();
|
this.tilemaps = new Array();
|
||||||
this.sceneGraph = new SceneGraphArray(this.viewport, this);
|
this.sceneGraph = new SceneGraphArray(this.viewport, this);
|
||||||
|
@ -146,14 +149,4 @@ export default class Scene{
|
||||||
getViewport(): Viewport {
|
getViewport(): Viewport {
|
||||||
return this.viewport;
|
return this.viewport;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Emit and event of type eventType with the data packet data
|
|
||||||
* @param eventType
|
|
||||||
* @param data
|
|
||||||
*/
|
|
||||||
emit(eventType: string, data: Map<any> | Record<string, any> = null): void {
|
|
||||||
let event = new GameEvent(eventType, data);
|
|
||||||
EventQueue.getInstance().addEvent(event);
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -7,6 +7,7 @@ import Vec2 from "./DataTypes/Vec2";
|
||||||
import UIElement from "./Nodes/UIElement";
|
import UIElement from "./Nodes/UIElement";
|
||||||
import Button from "./Nodes/UIElements/Button";
|
import Button from "./Nodes/UIElements/Button";
|
||||||
import Layer from "./Scene/Layer";
|
import Layer from "./Scene/Layer";
|
||||||
|
import { GameEventType } from "./Events/GameEventType";
|
||||||
|
|
||||||
export default class SecondScene extends Scene {
|
export default class SecondScene extends Scene {
|
||||||
|
|
||||||
|
@ -40,7 +41,7 @@ export default class SecondScene extends Scene {
|
||||||
backgroundTilemap.getLayer().setAlpha(0.2);
|
backgroundTilemap.getLayer().setAlpha(0.2);
|
||||||
|
|
||||||
// Add the music and start playing it on a loop
|
// Add the music and start playing it on a loop
|
||||||
this.emit("play_sound", {key: "level_music", loop: true, holdReference: true});
|
this.emitter.fireEvent(GameEventType.PLAY_SOUND, {key: "level_music", loop: true, holdReference: true});
|
||||||
|
|
||||||
// Add the tilemap
|
// Add the tilemap
|
||||||
this.add.tilemap("level2", OrthogonalTilemap);
|
this.add.tilemap("level2", OrthogonalTilemap);
|
||||||
|
@ -63,19 +64,19 @@ export default class SecondScene extends Scene {
|
||||||
recordButton.setSize(100, 50);
|
recordButton.setSize(100, 50);
|
||||||
recordButton.setText("Record");
|
recordButton.setText("Record");
|
||||||
recordButton.setPosition(400, 30);
|
recordButton.setPosition(400, 30);
|
||||||
recordButton.onClickEventId = "record_button_press";
|
recordButton.onClickEventId = GameEventType.START_RECORDING;
|
||||||
|
|
||||||
let stopButton = this.add.uiElement(Button, uiLayer);
|
let stopButton = this.add.uiElement(Button, uiLayer);
|
||||||
stopButton.setSize(100, 50);
|
stopButton.setSize(100, 50);
|
||||||
stopButton.setText("Stop");
|
stopButton.setText("Stop");
|
||||||
stopButton.setPosition(550, 30);
|
stopButton.setPosition(550, 30);
|
||||||
stopButton.onClickEventId = "stop_button_press";
|
stopButton.onClickEventId = GameEventType.STOP_RECORDING;
|
||||||
|
|
||||||
let playButton = this.add.uiElement(Button, uiLayer);
|
let playButton = this.add.uiElement(Button, uiLayer);
|
||||||
playButton.setSize(100, 50);
|
playButton.setSize(100, 50);
|
||||||
playButton.setText("Play");
|
playButton.setText("Play");
|
||||||
playButton.setPosition(700, 30);
|
playButton.setPosition(700, 30);
|
||||||
playButton.onClickEventId = "play_button_press";
|
playButton.onClickEventId = GameEventType.PLAY_RECORDING;
|
||||||
|
|
||||||
let cycleFramerateButton = this.add.uiElement(Button, uiLayer);
|
let cycleFramerateButton = this.add.uiElement(Button, uiLayer);
|
||||||
cycleFramerateButton.setSize(150, 50);
|
cycleFramerateButton.setSize(150, 50);
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import Map from "../DataTypes/Map";
|
import Map from "../DataTypes/Map";
|
||||||
import Receiver from "../Events/Receiver";
|
import Receiver from "../Events/Receiver";
|
||||||
import ResourceManager from "../ResourceManager/ResourceManager";
|
import ResourceManager from "../ResourceManager/ResourceManager";
|
||||||
|
import { GameEventType } from "../Events/GameEventType";
|
||||||
|
|
||||||
export default class AudioManager {
|
export default class AudioManager {
|
||||||
private static instance: AudioManager;
|
private static instance: AudioManager;
|
||||||
|
@ -12,7 +13,7 @@ export default class AudioManager {
|
||||||
private constructor(){
|
private constructor(){
|
||||||
this.initAudio();
|
this.initAudio();
|
||||||
this.receiver = new Receiver();
|
this.receiver = new Receiver();
|
||||||
this.receiver.subscribe(["play_sound", "stop_sound"]);
|
this.receiver.subscribe([GameEventType.PLAY_SOUND, GameEventType.STOP_SOUND]);
|
||||||
this.currentSounds = new Map();
|
this.currentSounds = new Map();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,14 +118,14 @@ export default class AudioManager {
|
||||||
// TODO - Add logic to merge sounds if there are multiple of the same key
|
// TODO - Add logic to merge sounds if there are multiple of the same key
|
||||||
while(this.receiver.hasNextEvent()){
|
while(this.receiver.hasNextEvent()){
|
||||||
let event = this.receiver.getNextEvent();
|
let event = this.receiver.getNextEvent();
|
||||||
if(event.type === "play_sound"){
|
if(event.type === GameEventType.PLAY_SOUND){
|
||||||
let soundKey = event.data.get("key");
|
let soundKey = event.data.get("key");
|
||||||
let loop = event.data.get("loop");
|
let loop = event.data.get("loop");
|
||||||
let holdReference = event.data.get("holdReference");
|
let holdReference = event.data.get("holdReference");
|
||||||
this.playSound(soundKey, loop, holdReference);
|
this.playSound(soundKey, loop, holdReference);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(event.type === "stop_sound"){
|
if(event.type === GameEventType.STOP_SOUND){
|
||||||
let soundKey = event.data.get("key");
|
let soundKey = event.data.get("key");
|
||||||
this.stopSound(soundKey);
|
this.stopSound(soundKey);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user