You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Game Maker 2.0中正确销毁碰撞other实例的实现方法

问题根因

你当前代码失效有两个核心原因:

  1. place_meeting()函数仅返回「是否碰撞」的布尔值,不会自动给other关键字赋值。other仅在GameMaker原生碰撞事件、with代码块内才会指向对应关联实例,你在Step事件里直接调用instance_destroy(other),销毁的根本不是碰撞到的直升机实例。
  2. 你把销毁导弹自身的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 03:21:35