GMS1.4碰撞敌方对象时已定义的life变量提示未定义如何解决
问题根因
other变量只有在GameMaker的**原生碰撞事件(Collision Event)**中才会自动指向碰撞对象,你在Step事件中手动调用place_meeting做碰撞检测时,系统不会自动给other赋值,直接调用with(other)相当于操作了一个不存在的实例对象。- 就算
other有值,进入with块后当前作用域会自动切换为with指定的实例,此时块内的other会反向指向调用with的原实例(也就是火球对象),火球本身没有定义life变量,自然会触发未定义报错。同时你写的self.start_decay也会错误地给敌方实例赋值,根本改不到火球自身的属性。
修正方案
推荐直接通过instance_place获取碰撞到的敌方实例ID后操作,逻辑清晰不容易搞混作用域:
// 火球Step事件修正后代码 var collide_enemy = instance_place(x, y, obj_enemy); // 先判断确实碰撞到了有效实例再操作,避免极端帧实例销毁导致的报错 if (collide_enemy != noone && instance_exists(collide_enemy)) { collide_enemy.life -= 1; start_decay = true; // 火球自身属性直接赋值即可 }
如果要保留with写法,需要明确指定要操作的实例,同时区分作用域:
if (place_meeting(x, y, obj_enemy)) { // 直接指定敌方实例作为with的操作对象 with (instance_place(x, y, obj_enemy)) { life -= 1; // 当前作用域是敌方实例,直接访问life属性 } start_decay = true; // 火球属性放在with块外操作,避免混淆 }
内容的提问来源于stack exchange,提问作者Granth
相关产品推荐
相关产品推荐

