-
Notifications
You must be signed in to change notification settings - Fork 0
/
game.js
114 lines (103 loc) · 2.87 KB
/
game.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import { initialize } from "./initialize.js";
import { loadModels, createFireSpellModel } from "./models.js";
import { initializeInput } from "./input.js";
import { createMageHandler } from "./mage.js";
import { updateHelpers } from "./helpers.js";
import { createSpellsHandler } from "./spells.js";
import { init as initFire } from "./Fire.js";
export function setupGame() {
const { scene, camera, renderer } = initialize();
const models = {
mage: undefined,
grassTile: undefined,
waterTile: undefined,
fireSpell: undefined,
};
const actors = {
mage: undefined,
};
const handlers = {
input: undefined,
mage: undefined,
spells: undefined,
};
const mageFollower = createMageFollower(camera, actors);
return loadModels()
.then(({ mage, grassTile, waterTile, fireSpell }) => {
models.mage = mage;
models.grassTile = grassTile;
models.waterTile = waterTile;
models.fireSpell = createFireSpellModel();
})
.then(createActors)
.then(createHandlers)
.then(initializeGame)
.then(() => ({
models,
actors,
handlers,
scene,
camera,
renderer,
frameListeners: [
handlers.input,
handlers.mage,
handlers.spells,
updateHelpers(handlers.mage),
mageFollower,
],
}));
function createActors() {
actors.mage = models.mage.clone();
scene.add(actors.mage);
}
function createHandlers() {
handlers.input = initializeInput();
handlers.spells = createSpellsHandler(scene, models.fireSpell);
handlers.mage = createMageHandler({
mageObject: actors.mage,
inputHandler: handlers.input,
spellHandler: handlers.spells,
});
}
function initializeGame() {
mageFollower.followMage();
camera.lookAt(actors.mage.position);
for (let x = -25; x <= 25; x++) {
for (let z = -25; z <= 25; z++) {
const tile =
(x + z) % 2 === 0
? models.grassTile.clone()
: models.waterTile.clone();
tile.position.x += x;
tile.position.z += z;
scene.add(tile);
}
}
initFire(scene, camera, renderer);
}
}
export function runGame({ frameListeners, scene, camera, renderer }) {
let lastFrameTime = new Date().getTime();
animationFrameRecursive(lastFrameTime);
function animationFrameRecursive(currentTime) {
const timeElapsed = currentTime - lastFrameTime;
lastFrameTime = currentTime;
requestAnimationFrame(animationFrameRecursive);
frameListeners.forEach((listener) => listener.applyFrame(timeElapsed));
renderer.render(scene, camera);
}
}
function createMageFollower(camera, actors) {
return {
applyFrame() {
this.followMage();
},
followMage() {
if (actors.mage) {
camera.position.x = actors.mage.position.x;
camera.position.z = actors.mage.position.z + 20;
}
},
};
}