嗨,大家好我有一个简单的语法参考问题,我建立一个视频游戏,我有一个情况,敌人来到一个城堡做dmg反弹,你射箭杀死他们。当我实例化一个敌人时,在将它放入游戏之前,我会为碰撞检测等事件添加一个事件监听器。现在当箭射杀怪物时,它摆脱了怪物图形,但由于它们上面有一个事件监听器,它们会持续存在于游戏环境中并继续摧毁城墙。
现在由于我的1300+游戏行代码中的编码结构,我需要做一个外部引用来剥离这个onEnterFrame eventlistener的敌人movieclip。这可以通过我设置的三种方式之一进行访问 -
1)很明显在实例化的类中,当我构建它时(我刚刚说完我不能这样做,因为它实际上是由箭击中它并且低于0生命值而被调用)
2)我已将它们构建成一个数组:我有一个全局myenemyarray,它可以保存游戏中的每个怪物(主要用于碰撞检测)但是它们都有一个递增的ID号以便于参考
3)继承:我希望能够指出它,我一直想象像stage.gameWindowMovieClip.enemyToRemoveMovieClip.removeEventListener(Event.ENTER_FRAME,codePerFrame)
我确实想过一个解决方法,但我确定它会非常无记忆内存,也就是说,我可以通过拥有一个敌人变量IsDead = 0来使选项#1工作,并且它将执行所有卸载例程(摆脱它)监听器,摆脱阵列拼接,摆脱舞台上的物体),击中怪物的箭头可以修改怪物hp,并且在perEnterFrame上看看如果hp低于0,切换isdead,然后调用卸载。这可能会工作,但它非常草率,我非常确定内存占用(我试图将所有实例化对象的perenframerame保持在最低限度)
无论如何,如果有人知道如何通过数组或继承远程删除movieclips eventlistener(onenterframe)请与我分享,我将不胜感激,谢谢;)
答案 0 :(得分:1)
每个敌人都不应该有自己的倾听者。相反,您应该在EnterFrame事件上有一个集中更新方法。这个方法应循环遍历所有需要更新的元素,即敌人,子弹,碰撞检测等,并为每个元素调用更新方法。
从阵列中移除敌人并将其从舞台上移除,完成。阵列中其余现有敌人将继续相应更新。
正如您所描述的那样,您应该能够使用碰撞检测循环的索引:
myenemyarray[ index of loop when hit occurred ].removeEventListener( Event.ENTER_FRAME, codePerFrame ); //kill enemy listener
removeChild( myenemyarray[ index of loop when hit occurred ] ); //remove enemy from stage
myenemyarray.splice( index of loop when hit occurred, 1 ); //remove enemy from array