你好:

再见,每个人

我已经花了大约一周的时间在做一个真正有效的FSM上,现在我觉得我已经找到了一个比较合理的东西,并且对我来说是比较容易理解的。其中大部分都可以正常工作,移动和其他东西都可以正常工作。唯一一个我还在努力解决的问题是添加新的状态来响应键盘按键。这个时候我的目标是当按下"S"键时触发一次攻击,这个确实可以正常工作,但是问题是当我按下"S"键时,动画只会闪烁一秒钟,而不是播放整个动画。我想这可能是由于图像索引和图像的原因,尝试了改变这个部分,但是仍然卡住。如果有人知道我做错了什么或者我缺少什么,我很感激。坦白地说,我只是很高兴能得到一个大部分可以正常工作的东西,因为我花了很长时间,遇到了很多问题。

以下是我的所有代码:

创建事件:
// 枚举
enum PLAYERSTATE{
IDLE,
RUN,
MATTKH
}
状态 = PLAYERSTATE.IDLE;
状态数组[PLAYERSTATE.IDLE] = Midle;
状态数组[PLAYERSTATE.RUN] = Mrun;
状态数组[PLAYERSTATE.MATTKH] = MF_attk_heav;
攻击 = 0;
攻击开始 = 假;
步骤事件:
执行脚本(get_inputs);
执行脚本(状态数组[状态])

get_inputs 脚本:
功能 get_inputs(){
// 所有移动输入
移动 = 假;
var move_speed = 9;
if (keyboard_check(vk_left)) {
sprite_index = run;
x -= move_speed;
移动 = 真;
面向 = 1;
} else if (keyboard_check(vk_right)) {
sprite_index = run;
x += move_speed;
移动 = 真;
面向 = -1;
} else {
sprite_index = idle_sheet;
}
// 战斗输入(显然是一个WIP lol)
MHattack = (keyboard_check_pressed(ord("S")));
}

Midle 脚本(静止状态脚本):
// 静止状态
功能 Midle(){
如果 (移动) {
状态 = PLAYERSTATE.RUN;
image_index = 0;
}
// 在静止中切换到攻击
如果 MHattack {
状态 = PLAYERSTATE.MATTKH;
image_index = 0;
攻击开始 = 假;
返回;
}
// 动画
sprite_index = idle_sheet;
image_speed = 1;
}

Mrun 脚本(跑步状态脚本):
// 跑步状态
功能 Mrun(){
如果 (!移动) {
状态 = PLAYERSTATE.IDLE;
image_index = 0;
返回;
}
// 在跑步中切换到攻击
如果 MHattack {
状态 = PLAYERSTATE.MATTKH;
image_index = 0;
攻击开始 = 假;
返回;
}
}

MF_attk_Heav 脚本(具体的重型攻击 - 将会有轻、中、重等不同形式的攻击 - 至少,这是我的计划。为了理解我的目标,我会停止废话并提供代码):
// 重型攻击状态
功能 MF_attk_heav(){
如果 (!攻击开始) {
攻击开始 = 真;
sprite_index = M_heav; // <---- 重型攻击图像
image_index = 0;
image_speed = 1;
攻击 = 1;
}
// 动画结束
如果 (image_index >= image_number - 1) {
攻击开始 = 假;
攻击 = 0;
如果 (移动) {
状态 = PLAYERSTATE.RUN;
} else {
状态 = PLAYERSTATE.IDLE;
}
image_index = 0;
返回;
}
}