我是新手,刚开始使用GameMaker,第一次在这个论坛发帖。基本上,我在寻找一种简洁的 Melee 攻击系统,我的小脑袋能够理解。虽然我不是在制作打击游戏,但我的作品受到它们的启发,所以我想要能够有不同的攻击类型,有轻、重和中等版本。

我已经查找了各种教程,但遗憾的是,找到的教程都很老,信息已经过时了。虽然我尝试了多个教程,但遇到的问题都一样。最后,我找到了一个最近的教程,内容还算清晰,所以我想如果能得到一些帮助,就可以让它工作了。所以我来这里求助了。

以下是我的脚本(命名为“States”)

function State (_sprite) {
    constructor {
        sprite = _sprite;
        stateonend = undefined;
        static Stateonend = function (_state) {
            stateonend = _state;
        }
        function State_set (_state) {
            if (state == _state) return;
            state = _state;
            sprite_index = state.sprite;
            image_index = 0;
        }
    }
}

我的代码在玩家对象的创建事件中:

facing = 1;
hp = 100;
hp_total = hp;
damage = 20;
// states
states = {
    idle : new State (idle_sheet),
    run : new State (Vi_run),
    Rheavattk : new State (RVi_heav)
}
states.Rheavattk.Stateonend(states.idle);
// set initial state
state = states.idle;

我的代码在玩家对象的步进事件中:

// movement controls
if (state == states.idle || state == states.run){
    if (keyboard_check(vk_left)) {
        State_set(states.run);
        x -= 9;
    } else if (keyboard_check(vk_right)) {
        State_set(states.run);
        x += 9;
    } else {
        State_set(states.idle);
    }
    if keyboard_check_pressed (vk_right){
        facing = abs(facing);
    }
    if keyboard_check_pressed (vk_left){
        facing = -abs(facing);
    }
    // combat controls
    if keyboard_check_pressed(ord("W")){
        State_set(state.Rheavattk);
    }
}

我遇到的问题是代码报错“Variable oplayer.State_set - not set before reading it”,我尝试了很多方法,但还是没能解决这个问题。错误提示是在 'State_set(states.idle);' 这一行出现的。看起来我在创建事件中已经设置了 state = states.idle,但是它还是报错。

我希望有人能帮助我解决这个问题,或者提供更好的方法来实现 Melee 攻击系统。