AS3蛇游戏开发求助:移除蛇身片段后无法隐藏的问题
蛇游戏开发问题:移除蛇身片段后视觉不消失
我是编程初学者,正在开发带附加功能的蛇游戏,需求是蛇吃到特定食物时移除5段蛇身。目前已经能移除数组里的元素,但被移除的蛇身片段在视觉上不会消失。之前试过array.splice()没用,改用array.pop()实现了数组元素移除,但不确定效率如何,也不确定var spliced:Sprite = partsArr.pop();的写法是否合理。
当前代码(含之前尝试的注释)
function removePart():void { var spliced:Sprite = partsArr.pop(); partsArr.pop(); partsArr.pop(); partsArr.pop(); partsArr.pop(); partsArr.pop(); removeChild(spliced); spliced.visible= false; newPassFood(); //what i've tried previously /*var spliced:Array = partsArr.splice(-1,5);*/ /*var newPart:Sprite = new BodyPart();*/ /*addChild(newPart);*/ /*newPart.visible= false;*/ /* for (var i:int = partsArr.length-1;i > 0; i--) { partsArr.splice(i, 5); removeChild(newPart); removeChild(newPart); removeChild(newPart); } */ /* if (partsArr.splice (partsArr.indexOf(newPart) == 1)) //removes 5 tiles from snake body { removeChild(newPart); } */ /*removeChild(partsArr[5]);*/ /*removeChild(newPart);*/ }
修改后的代码
function removePart():void { var container:Sprite = new Sprite(); var removearray:Array = partsArr.pop(); container.removeChild(removearray); partsArr.pop(); partsArr.pop(); partsArr.pop(); partsArr.pop(); partsArr.pop(); }
问题分析与解决思路
当前代码的核心问题
- 你调用了五次
pop(),但只对第一个弹出的Sprite执行了removeChild和设为不可见,剩下四个弹出的Sprite完全没从显示列表中移除,所以视觉上依然存在。 - 修改后的代码里创建了空的
container,但这个容器从未添加到舞台,调用它的removeChild毫无作用;而且removearray的类型声明错误——pop()返回单个Sprite,不是数组。
- 你调用了五次
正确的实现方式
- 不管用
pop()还是splice(),必须确保每一个被移除的蛇身Sprite都从显示列表中移除。用splice()更高效,一次操作就能批量取出并移除数组末尾的5个元素:
- 不管用
function removePart():void { // 从数组末尾取出最后5个蛇身片段,同时从数组中移除它们 var removedParts:Array = partsArr.splice(-5, 5); // 遍历取出的片段,逐个从显示列表移除 for each(var part:Sprite in removedParts) { if(part.parent) { // 先判断是否在显示列表中,避免抛出错误 part.parent.removeChild(part); } // 可选:销毁资源避免内存泄漏 part.graphics.clear(); part = null; } newPassFood(); }
关于
pop()写法的合理性var spliced:Sprite = partsArr.pop();语法本身没问题,前提是partsArr中存储的都是Sprite类型。但你之前只处理了第一个弹出的元素,剩下四个没处理,这才是视觉不消失的关键原因。- 相比重复调用五次
pop(),splice()更简洁高效,一次就能完成批量移除操作。
修改后代码的错误修正
- 不要创建新的空容器,蛇身片段应该是添加到舞台或某个已存在的容器中,需要从它实际的父容器里移除。
partsArr.pop()返回单个Sprite,不能声明为Array类型,这会导致类型不匹配错误。
内容的提问来源于stack exchange,提问作者webdog
相关产品推荐
相关产品推荐

