Game Maker 2.0中正确销毁碰撞other实例的实现方法
问题根因
你当前代码失效有两个核心原因:
place_meeting()函数仅返回「是否碰撞」的布尔值,不会自动给other关键字赋值。other仅在GameMaker原生碰撞事件、with代码块内才会指向对应关联实例,你在Step事件里直接调用instance_destroy(other),销毁的根本不是碰撞到的直升机实例。- 你把销毁导弹自身的
instance_destroy()写在了逻辑最前面,GMS2中实例调用instance_destroy()后,本次事件内后续代码会直接终止执行,哪怕other指向正确,后面的销毁直升机、更新全局变量的逻辑都不会运行。
额外提一个非碰撞相关的小bug:你生成直升机的判断条件global.num_helicopters <= global.max_helicopters存在边界问题,当直升机数量等于上限时还会继续生成1架,最终数量会比设定上限多1,建议后续调整为<判断。
正确实现方案
选任意一种方案即可:
方案1:保留Step事件碰撞检测
把place_meeting()替换为instance_place(),这个函数会直接返回碰撞到的实例ID,拿到ID后再做销毁操作,同时把销毁自身的逻辑放到代码最后:
// 获取碰撞到的直升机实例ID,未碰撞时会返回noone var hit_helicopter = instance_place(x + hspeed, y + vspeed, obj_helicopter); if (hit_helicopter != noone) { global.num_helicopters--; global.score += 10; instance_destroy(hit_helicopter); // 销毁命中的直升机 instance_destroy(); // 最后销毁导弹自身,避免截断后续逻辑 }
方案2:使用原生碰撞事件
如果要改用可视化碰撞事件实现,先提前检查两个对象的精灵碰撞掩码:不要开无必要的精确碰撞,确认碰撞框尺寸、偏移符合预期,避免判定失效。之后在导弹对象的与obj_helicopter碰撞事件中写如下代码:
global.num_helicopters--; global.score += 10; instance_destroy(other); // 原生碰撞事件内other自动指向碰撞到的直升机 instance_destroy();
内容的提问来源于stack exchange,提问作者Alberto Sánchez
相关产品推荐
相关产品推荐

