Gamemaker - 在没有碰撞事件的情况下销毁特定实例

时间:2018-03-10 01:23:24

标签: instance game-maker-language

我刚刚开始使用游戏制作工作室2,而且我已经在这个问题上摸了一会儿。

我需要能够在不使用碰撞事件的情况下销毁敌人对象的特定实例。这是我目前的代码:

在我的播放器对象中:

if (sprite_index = spr_player_attack_left) {
    if (obj_enemy.x > x - 25 && obj_enemy.x < x) {
        obj_enemy.hp--;
    }
}

//detect right
if (sprite_index = spr_player_attack_right) {
    if (obj_enemy.x < x + 25 && obj_enemy.x > x) {
        obj_enemy.hp--;
    }
}

//detect up
if (sprite_index = spr_player_attack_up) {
    if (obj_enemy.y > y - 25 && obj_enemy.y < y) {
        obj_enemy.hp--;
    }
}

//detect down
if (sprite_index = spr_player_attack_up) {
    if (obj_enemy.y < y + 25 && obj_enemy.y > y) {
        obj_enemy.hp--;
    }
}

在我的敌人对象中:

if (hp <= 0) {
    var attacked = instance_find(obj_enemy, this.id);
    instance_destroy(attacked);
}

目前房间里只有一个敌人登记攻击,当我攻击该实例时,所有实例都被销毁,而我只想要销毁一个。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

发生这种情况的原因是因为您使用的是对象索引,而不是特定实例的索引。当你这样做时:

<object_index>.<object_property> eg. obj_enemy.hp

可能会发生两件事:

  1. 如果游戏中有一个当前活动的实例,那么 将引用实例的变量。
  2. 如果有两个或更多实例,那么GameMaker无法告诉您要引用哪个实例。
  3. 这里的违规代码是if语句:

    if (obj_enemy.x > x - 25 && obj_enemy.x < x) {
        obj_enemy.hp--;
    }
    

    你可以重写它们的方式是:

    with (obj_enemy) {
        if (x > other.x - 25 && x < other.x) hp--;
    }
    

    同样适用于所有其他if语句。 with关键字在此处充当循环。您可以将其读作&#34;浏览obj_enemy的每个实例并在{...}&#34;之间执行代码。要引用with语句之外的实例,我们使用other(在此示例中,other将是播放器)。

    对于敌方对象中的代码,您根本不必使用instance_find。实际上this.id部分完全无效,除非您在该代码运行之前将this定义为实例变量。

    无论如何,正确的版本将是:

    if (hp <= 0) {
        instance_destroy();
    }
    

    instance_destroy函数会破坏当前在范围内的实例(在GMS2或GMS1 Early Access中,您可以将其传递给您想要销毁的实例的其他ID)。