我刚刚开始使用游戏制作工作室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);
}
目前房间里只有一个敌人登记攻击,当我攻击该实例时,所有实例都被销毁,而我只想要销毁一个。
提前感谢您的帮助!
答案 0 :(得分:0)
发生这种情况的原因是因为您使用的是对象索引,而不是特定实例的索引。当你这样做时:
<object_index>.<object_property> eg. obj_enemy.hp
可能会发生两件事:
这里的违规代码是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)。