-
Notifications
You must be signed in to change notification settings - Fork 0
/
Spawner.js
50 lines (43 loc) · 1.4 KB
/
Spawner.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Spawner {
assetPaths = [];
className = "";
events = {};
frequency = () => 1000;
id = `spawner${randomId()}`;
/**
* @type {Game}
*/
game = null;
constructor({ assetPaths, className, events = {}, game } = {}) {
this.assetPaths = assetPaths;
this.className = className;
this.events = events;
this.game = game;
}
spawn() {
const element = document.createElement("img");
element.src = this.assetPaths[Math.floor(Math.random() * this.assetPaths.length)];
element.classList.add("spawn", this.className);
element.addEventListener("animationend", () => element.remove());
const gameElement = new GameElement(element);
Object.entries(this.events).forEach(([eventName, callback]) => gameElement._element.addEventListener(eventName, (event) => callback(event, gameElement)));
return gameElement;
}
/**
* @param {GameScene} scene
*/
spawnInto(scene) {
const spawn = this.spawn();
spawn.x = Math.ceil(Math.random() * (scene.width - 32));
scene.renderGameElement(spawn);
if ("render" in this.events) {
this.events.render({}, spawn);
}
if ("frame" in this.events) {
window.requestAnimationFrame(() => this.events.frame({}, spawn));
}
}
destroy(element) {
element.remove();
}
}