added enums for event type and added an emitter class

This commit is contained in:
Joe Weaver 2020-09-19 20:18:39 -04:00
parent d452678344
commit a67521ea26
13 changed files with 135 additions and 72 deletions

20
src/Events/Emitter.ts Normal file
View 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));
}
}

View File

@ -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);
} }
} }

View 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",
}

View File

@ -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);
} }

View File

@ -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()
} }
} }

View File

@ -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);
} }
} }

View File

@ -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());

View File

@ -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

View File

@ -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;

View File

@ -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;
} }

View File

@ -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);
}
} }

View File

@ -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);

View File

@ -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);
} }