forked from marijnh/Eloquent-JavaScript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path16_3_a_monster.html
More file actions
62 lines (50 loc) · 1.68 KB
/
16_3_a_monster.html
File metadata and controls
62 lines (50 loc) · 1.68 KB
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
<!doctype html>
<base href="http://eloquentjavascript.net/">
<script src="code/game_levels.js"></script>
<script src="code/chapter/16_game.js"></script>
<link rel="stylesheet" href="css/game.css">
<style>
.monster { background: purple }
</style>
<body>
<script>
const monsterSpeed = 4;
class Monster {
constructor(pos) { this.pos = pos; }
get type() { return "monster"; }
static create(pos) { return new Monster(pos.plus(new Vec(0, -1))); }
update(time, state) {
let player = state.player;
let speed = (player.pos.x < this.pos.x ? -1 : 1) * time * monsterSpeed;
let newPos = new Vec(this.pos.x + speed, this.pos.y);
if (state.level.touches(newPos, this.size, "wall")) return this;
else return new Monster(newPos);
}
collide(state) {
let player = state.player;
if (player.pos.y + player.size.y < this.pos.y + 0.5) {
let filtered = state.actors.filter(a => a != this);
return new State(state.level, filtered, state.status);
} else {
return new State(state.level, state.actors, "lost");
}
}
}
Monster.prototype.size = new Vec(1.2, 2);
levelChars["M"] = Monster;
runLevel(new Level(`
..................................
.################################.
.#..............................#.
.#..............................#.
.#..............................#.
.#...........................o..#.
.#..@...........................#.
.##########..............########.
..........#..o..o..o..o..#........
..........#...........M..#........
..........################........
..................................
`), DOMDisplay);
</script>
</body>