AS3蛇游戏开发:如何正确使用splice()移除蛇身数组元素?
蛇游戏缩短蛇身功能问题求助
我是编程新手,正在开发一款蛇游戏,场景里设置了三种果实:一种吃了用push()方法增加蛇身长度,另一种打算用splice()方法缩短蛇身。目前代码没有报错,但功能达不到预期,先后试了splice()和pop()的各种写法,还是存在蛇身元素移除后没隐藏的问题。附上几个版本的代码,想确认splice()是否适用于这个场景,同时寻求解决办法。
初始代码
var partsArr:Array = new Array(); //holds Snake’s head and body parts function attachNewPart():void { var newPart:Sprite = new BodyPart(); addChild(newPart); partsArr.push(newPart); //add 1 part into snake body } function removePart():void { var newPart:Sprite = new BodyPart(); removeChild(newPart); partsArr.splice(newPart, 5); //removes 5 parts from snake body newPassFood(); // generate new remover food }
修改后代码1
function removePart():void { var spliced:Array = partsArr.splice(-1,5); var newPart:Sprite = new BodyPart(); addChild(newPart); newPart.visible= false; spliced.visible= false; newPassFood(); // some code i tried but didn't work /* 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);*/ }
修改后代码2
function removePart():void { /*var spliced:Array = partsArr.splice(-1,5);*/ var spliced:DisplayObject = partsArr.pop(); var newPart:Sprite = new BodyPart(); partsArr.pop(); partsArr.pop(); partsArr.pop(); partsArr.pop(); partsArr.pop(); addChild(newPart); spliced.visible= false; newPassFood(); }
问题分析与解决办法
首先明确:splice()完全适用于这个场景,你的问题核心是对splice()用法理解有误,且操作的不是蛇身的实际元素。
你的代码里的关键错误
- 初始代码中,
removePart()里新建的newPart根本不是蛇身的一部分,调用removeChild(newPart)完全无效;而且splice(newPart, 5)用法错误——splice()第一个参数是数组的索引位置,不是数组元素。 - 修改后代码1里,
spliced是splice()返回的被删除元素数组,直接给数组设置visible=false没用,得遍历数组里的每个蛇身元素操作;另外新建newPart并添加到舞台属于多余操作,反而会增加无效元素。 - 修改后代码2里,连续
pop()5次但只给第一个弹出的元素设了不可见,剩下4个被移除的元素还在舞台上,所以看起来没隐藏;同样新建了多余的newPart。
正确实现思路
要缩短蛇身,必须完成这几步:
- 确认蛇身长度足够删除(至少保留蛇头)
- 从数组中移除指定数量的蛇身元素(推荐从尾部删,符合蛇的移动逻辑)
- 将被移除的元素从舞台上删除(或设为不可见,更推荐删除以节省内存)
- 生成新的减身果实
正确代码示例
var partsArr:Array = new Array(); // 存储蛇头和蛇身部件 // 增加蛇身的方法(你的原有逻辑没问题,可以保留) function attachNewPart():void { var newPart:Sprite = new BodyPart(); addChild(newPart); partsArr.push(newPart); } // 正确的缩短蛇身方法(删除最后5个部件,保留蛇头) function removePart():void { // 防止蛇身被删到只剩0个元素,至少留蛇头 if (partsArr.length <= 1) { return; } // 计算实际能删除的数量,避免数组越界 var removeCount:int = Math.min(5, partsArr.length - 1); // 从数组尾部开始删除removeCount个元素,返回被删除的元素数组 var removedParts:Array = partsArr.splice(partsArr.length - removeCount, removeCount); // 遍历被删除的元素,从舞台上移除 for each (var part:Sprite in removedParts) { if (contains(part)) { removeChild(part); } } newPassFood(); // 生成新的减身果实 }
补充说明
- 如果需要从蛇身中间删除元素,只需要调整
splice()的第一个索引参数即可,比如partsArr.splice(2,5)就是从索引2的位置开始删除5个元素。 - 不要随便新建
BodyPart实例,删除操作只需要处理数组中已有的蛇身元素。 - 一定要做长度判断,避免出现蛇身被删空的情况。
内容的提问来源于stack exchange,提问作者webdog
相关产品推荐
相关产品推荐

