-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathState.pde
89 lines (83 loc) · 2.31 KB
/
State.pde
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
private abstract class State implements Cloneable {
protected GameObject object;
protected int stateFrame;
protected int stateTime;
protected int loopCounter, loopNum;
protected LoopType loopType;
private boolean reverceFlag;
// Stateが起動しているかどうか
private boolean isActive;
// ディープコピーを可能とするためにオーバーライド
@Override
public State clone() {
State state = new State() {
@Override protected void onUpdate() {}
};
try {
state = (State)super.clone();
//state.object = this.object.clone();
} catch (Exception e){
e.printStackTrace();
}
return state;
}
// Stateを開始するメソッド
protected final void enter() {
stateFrame = 0;
stateTime = 0;
isActive = true;
onEnter();
}
protected final void exitState() {
isActive = false;
onExit();
}
// StateのメソッドをFrameごとに実行
protected final void update() {
if(!isActive) {
return;
}
onUpdate();
if(!reverceFlag) {
stateTime = toTime(++stateFrame);
} else {
stateTime = toTime(--stateFrame);
}
}
protected final void back() {
reverceFlag = true;
}
protected final void replay() {
reverceFlag = false;
stateFrame = 0;
loopCounter++;
}
protected final boolean isActive() {
return isActive;
}
protected void checkLoop() {
if(loopType == LoopType.YOYO && !reverceFlag) {
back();
return;
}
if(loopCounter == loopNum) {
exitState();
}
if(loopType == LoopType.RESTART || loopType == LoopType.YOYO) {
replay();
}
}
protected final State setObject(GameObject object) {
this.object = object;
return this;
}
/**
* サブクラスにて詳細を記述
*/
// Stateに遷移した時に実行するメソッド
protected void onEnter() {}
// Stateに留まっている時に実行するメソッド
protected abstract void onUpdate();
// Stateに遷移する時に実行するメソッド
protected void onExit() {}
}