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

Posted

技术标签:

【中文标题】Gamemaker - 在没有碰撞事件的情况下销毁特定实例【英文标题】:Gamemaker - destroy a specific instance without collision event 【发布时间】:2018-03-10 01:23:23 【问题描述】:

我刚刚开始使用 gamemaker studio 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】:

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

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

可能会发生两种情况:

    如果游戏中当前有一个实例处于活动状态,那么 实例的变量将被引用。 如果有两个或更多实例,则 GameMaker 无法判断您要引用哪一个。

这里有问题的代码是 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 关键字在这里充当循环。您可以将其理解为“遍历 obj_enemy 的每个实例并在 ... 之间执行代码”。要在with 语句之外引用实例,我们使用other(在此示例中,other 将是播放器)。

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

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

if (hp <= 0) 
    instance_destroy();

instance_destroy 函数销毁当前范围内的实例(在 GMS2 或 GMS1 抢先体验中,您可以向它传递一个您希望销毁的实例的附加 ID)。

【讨论】:

以上是关于Gamemaker - 在没有碰撞事件的情况下销毁特定实例的主要内容,如果未能解决你的问题,请参考以下文章

[UE4]Overlap Event 碰撞事件

如何在没有物理的情况下检测碰撞

unity3d 怎么检测碰撞?比如主角碰撞到物体之后销毁被撞到的物体

2D 数组未正确访问 globalvar (GameMaker)

GameMaker Studio 2 - 多个事件 - 如果 mouse_enter 事件则绘制

Python笔记22——飞机大战(下)