-
-
Notifications
You must be signed in to change notification settings - Fork 56
/
Copy pathai.js
99 lines (82 loc) · 2.37 KB
/
ai.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
// @ts-check
// Use state() component to handle basic AI
// Start kaplay
kaplay();
// Load assets
loadSprite("bean", "/sprites/bean.png");
loadSprite("ghosty", "/sprites/ghosty.png");
const SPEED = 320;
const ENEMY_SPEED = 160;
const BULLET_SPEED = 800;
// Add player game object
const player = add([
sprite("bean"),
pos(80, 80),
area(),
anchor("center"),
]);
const enemy = add([
sprite("ghosty"),
pos(width() - 80, height() - 80),
anchor("center"),
// This enemy cycle between 3 states, and start from "idle" state
state("move", ["idle", "attack", "move"]),
]);
// Run the callback once every time we enter "idle" state.
// Here we stay "idle" for 0.5 second, then enter "attack" state.
enemy.onStateEnter("idle", async () => {
await wait(0.5);
enemy.enterState("attack");
});
// When we enter "attack" state, we fire a bullet, and enter "move" state after 1 sec
enemy.onStateEnter("attack", async () => {
// Don't do anything if player doesn't exist anymore
if (player.exists()) {
const dir = player.pos.sub(enemy.pos).unit();
add([
pos(enemy.pos),
move(dir, BULLET_SPEED),
rect(12, 12),
area(),
offscreen({ destroy: true }),
anchor("center"),
color(BLUE),
"bullet",
]);
}
// Waits 1 second to make the enemy enter in "move" state
await wait(1);
enemy.enterState("move");
});
// When we enter "move" state, we stay there for 2 sec and then go back to "idle"
enemy.onStateEnter("move", async () => {
await wait(2);
enemy.enterState("idle");
});
// .onStateUpdate() is similar to .onUpdate(), it'll run every frame, but in this case
// Only when the current state is "move"
enemy.onStateUpdate("move", () => {
// We move the enemy in the direction of the player
if (!player.exists()) return;
const dir = player.pos.sub(enemy.pos).unit();
enemy.move(dir.scale(ENEMY_SPEED));
});
// Taking a bullet makes us disappear
player.onCollide("bullet", (bullet) => {
destroy(bullet);
destroy(player);
addKaboom(bullet.pos);
});
// Register input handlers & movement
onKeyDown("left", () => {
player.move(-SPEED, 0);
});
onKeyDown("right", () => {
player.move(SPEED, 0);
});
onKeyDown("up", () => {
player.move(0, -SPEED);
});
onKeyDown("down", () => {
player.move(0, SPEED);
});