01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
view
plaincopy
switch
(
自己
)
{
case
“血量充足”
:
打怪
(
)
;
break;
case
“快死了”
:
补血
(
)
;
break;
case
“死了”
:
游戏全局
-
>
Gameover
(
)
;
break;
}
|
01
02
03
04
05
06
07
08
09
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
|
[java]
view
plaincopy
/
*
*
*
FSMState:
*
/
public abstract
class
FSMState
{
public FSMAIControl m_parent;
public int m_type;
public abstract void Enter
(
)
;
/
/
状态进入时执行动作
public abstract void Exit
(
)
;
/
/
状态退出时执行动作
public abstract void Update
(
)
;
/
/
游戏主循环中状态的内部执行机制
public abstract void Init
(
)
;
/
/
状态的初始化
public FSMState CheckTransition
(
)
;
/
/
状态转移判断
}
/
*
*
*
FSMMachine
*
/
public
class
FSMMachine
{
private ArrayList
<
FSMState
>
m_states;
private FSMState m_currentState;
private FSMState m_defaultState;
private FSMState m_goalState;
private int m_goalID;
public void UpdateMachine
(
)
;
/
/
更新状态机状态
public void AddState
(
FSMState
state
)
;
/
/
给状态机添加状态
public void SetDefaultState
(
FSMState
state
)
;
/
/
设置默认状态
public void SetGoalID
(
int goal
)
;
/
/
设置目标状态
public void TransitionState
(
int goal
)
;
/
/
状态转移
public void Reset
(
)
;
/
/
状态重置
}
/
*
*
*
FSMAIControl
*
/
public
class
FSMAIControl
{
public …
/
/
游戏感知数据
private FSMMachine m_machine;
public void Update
(
)
;
public void UpdatePerceptions
(
)
;
public void Init
(
)
;
}
|
然后就是要实现状态
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
public
class
StateA extends FSMState
{
public void Update
(
)
{
}
;
…
FSMState CheckTransitions
(
)
{
if
(
parent.xxx
=
xxx
)
/
/
判断感知数据
return
StateB;
}
…
}
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
view
plaincopy
public
class
StateA extends FSMState
{
public void Update
(
)
{
}
;
…
FSMState CheckTransitions
(
)
{
if
(
parent.xxx
=
xxx
)
/
/
判断感知数据
return
StateB;
}
…
}
|
4,确定转移状态的条件。
https://www.cnblogs.com/jeason1997/p/5140201.html