PhaserJS游戏开发:如何移除精灵组中的单个精灵
解决PhaserJS中生命值组单次只移除一个精灵的问题
嘿,我太懂你这个麻烦了!你现在用lifes.kill()直接把整个生命值组都清空,是因为Phaser里Group.kill()方法会遍历组内所有精灵,挨个调用它们的kill()——自然整个生命值条就没了。咱们调整下逻辑,实现每次碰撞只移除单个生命值:
核心思路
别直接操作整个组,而是找到组内还活着的最后一个(或第一个)生命值精灵,单独调用它的kill()方法就行。
修改后的hitNinja函数
从你的代码风格看应该用的是Phaser 2,咱们可以用框架自带的方法,简单又靠谱:
function hitNinja (ninja, ronins) { // 获取组内最后一个处于激活状态的生命值精灵 const targetLife = lifes.getLastAlive(); // 确保还有生命值可以移除 if (targetLife) { targetLife.kill(); } // 可选:如果要做生命值耗尽的逻辑,加这段就行 // if (!lifes.getFirstAlive()) { // // 这里写游戏结束的代码,比如弹出Game Over界面 // } }
要是你更习惯手动筛选(比如不同Phaser版本的兼容需求),也可以这么写:
function hitNinja (ninja, ronins) { // 筛选出组内所有还活着的生命值精灵 const aliveLifes = lifes.children.filter(life => life.alive); if (aliveLifes.length > 0) { // 移除最后一个活着的精灵(想从左边开始删就取aliveLifes[0]) aliveLifes[aliveLifes.length - 1].kill(); } }
为什么这样能解决问题?
getLastAlive()会精准定位组内最后一个没被杀死的精灵,只对它调用kill(),不会影响其他生命值显示。- 手动筛选的方式则是遍历组内子元素,挑出还在激活状态的精灵,再针对性移除。
改完之后,每次玩家被AI精灵碰到,就只会减少一条生命值,再也不会整个生命值条消失啦!
内容的提问来源于stack exchange,提问作者albator2018
相关产品推荐
相关产品推荐

