-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEnemyStates.js
124 lines (97 loc) · 3.02 KB
/
EnemyStates.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
115
116
117
118
119
120
121
122
123
124
/**@type {import("../typings/phaser")} */
class EnemyState {
constructor(){
}
}
export class EnemyIdle extends EnemyState{
constructor(){
super();
this.idleDelay = 0;
this.idleInterval = Phaser.Math.Between(500, 1000);
}
enter(enemy){
if(!enemy.body) return;
enemy.setVelocityX(0);
}
update(enemy, time, delta){
if(!enemy.body) return;
this.idleInterval = Phaser.Math.Between(500, 1000);
this.idleDelay+= delta;
if(this.idleDelay >= this.idleInterval){
let randomNumber = Math.random ();
if(randomNumber < 0.33){
enemy.lastDirection = "right";
}
else if(randomNumber < 0.66){
enemy.lastDirection = "left";
}
else{
enemy.stateMachine.setState(ENEMY_STATES.RUN, enemy);
}
this.idleDelay = 0;
}
}
}
export class EnemyRun extends EnemyState{
constructor(){
super();
this.distanceCovered = 0;
this.canIdle = false;
}
enter(enemy){
if(!enemy.body) return;
(enemy.lastDirection === "right") ? enemy.setVelocityX(enemy.speedX) : enemy.setVelocityX(-enemy.speedX);
}
updateDistanceCovered(enemy){
if(!enemy.body) return;
const bodyPosDiff = Math.abs(enemy.x - enemy.body.prev.x);
let maxDistance = Phaser.Math.Between(600, 1000);
if(this.distanceCovered < maxDistance){
this.distanceCovered += bodyPosDiff;
this.canIdle = false;
}
else{
maxDistance = Phaser.Math.Between(600, 1200);
this.distanceCovered = 0;
this.canIdle = true;
}
}
update(enemy, time, delta){
if(!enemy.body) return;
this.updateDistanceCovered(enemy);
enemy.turnTimer += delta;
if(this.canIdle){
enemy.stateMachine.setState(ENEMY_STATES.IDLE, enemy);
}
//RAY
if (!enemy.rayHasHit && enemy.turnTimer > enemy.turnInterval) {
enemy.speedX *= -1;
enemy.setVelocityX(enemy.speedX);
enemy.turnTimer = 0;
}
//SENSOR
if(enemy.sensorHasHit && enemy.turnTimer > enemy.turnInterval ){
enemy.speedX *= -1;
enemy.setVelocityX(enemy.speedX)
enemy.turnTimer = 0;
}
//flip appropriately
if(enemy.body.velocity.x > 0) enemy.lastDirection = "right";
if(enemy.body.velocity.x < 0) enemy.lastDirection = "left";
}
}
export const ENEMY_STATES = {
IDLE: new EnemyIdle(),
RUN: new EnemyRun()
}
export class EnemyStateMachine{
constructor(){
}
setState(state, enemy){
enemy.currentState = state;
state.enter(enemy);
}
updateState(state, enemy, time, delta){
state.update(enemy, time, delta);
}
}