GMS2子敌人生成器无法独立运作:销毁异常问题求助
解决方案
问题核心是敌人不知道自己属于哪个生成器,导致销毁时触发了所有生成器的变量修改。要实现子生成器独立运作,关键是给每个敌人绑定对应的生成器实例ID,让敌人只通知自己的父生成器。
1. 生成动画对象时传递生成器ID
修改父生成器的Step事件代码,创建动画对象后给它添加记录生成器ID的变量:
// PARENT STEP EVENT if(enemy_dead_count <= 0){ sprite_index = sDestroyed_Ghost_Spawner; if(image_index >= 9 && image_index < 10){ image_index = 9; instance_destroy(); // 动画播放完成后销毁当前生成器 } } else { while(spawn_ghost == 0){ // 创建动画实例并记录生成器ID var _anim = instance_create_layer(x,y+32,"Player",oEnemy_spawner_animation); _anim.spawner_id = id; spawn_ghost += 1; } }
2. 动画转敌人时传递生成器ID
修改动画对象的Step事件,转换为敌人时把生成器ID传递过去:
// animator step event if image_xscale <= 1 { image_xscale += 0.008; image_yscale = image_xscale; } else { image_xscale = 1; image_yscale = image_xscale; // 转换为敌人并传递生成器ID var _enemy = instance_change(oEnemy_ghost,true); _enemy.spawner_id = spawner_id; }
3. 敌人销毁时只通知对应生成器
修改敌人父对象的销毁代码,通过绑定的生成器ID找到目标生成器,避免影响其他实例:
if(hp <= 0){ var _spawner = spawner_id; instance_destroy(); // 先销毁敌人自身 // 确保生成器还存在再修改变量 if(instance_exists(_spawner)){ _spawner.spawn_ghost = 0; _spawner.enemy_dead_count -= 1; } }
关键说明
- 每个生成器、动画、敌人实例都有独立的变量空间,通过
id(实例唯一标识)绑定关系后,操作只会作用于目标实例。 - 增加
instance_exists(_spawner)判断是为了避免生成器已销毁时出现错误。
内容的提问来源于stack exchange,提问作者Julian Silvestri
相关产品推荐
相关产品推荐

