AS3技术问题:点击mc_gameover时如何完全隐藏grid()生成的网格?
解决AS3中点击按钮隐藏所有网格Tile的问题
你的代码存在两个关键问题:
tile是循环内部的局部变量,所以hidetile函数只能访问最后生成的那个Tile,这就是为什么只能移除一个的原因。grid是函数,不是显示对象,grid.visible = false完全无效,函数没有visible属性。
下面给两种实用的解决方法:
方案一:用容器统一管理(推荐)
创建一个Sprite容器,把所有Tile都放到这个容器里,之后只需要操作容器的可见性或移除容器,就能批量处理所有Tile。
修改后的完整代码:
function grid(): void { // 创建容器存放所有Tile var tileContainer:Sprite = new Sprite(); addChild(tileContainer); mc_gameover.btn_mainmenu.addEventListener(MouseEvent.CLICK, hidetile); function hidetile(event:MouseEvent):void { // 隐藏整个容器,所有Tile会一起被隐藏 tileContainer.visible = false; // 如果要彻底从舞台移除,替换成:removeChild(tileContainer); } for(var i:int = 0; i < rows; i++){ for(var j:int = 0; j < columns; j++){ var tile:Sprite = new Tile(); // 从库中获取Tile元件 // 排列Tile位置 tile.x = (headWidth/2) + (j * headWidth); tile.y = (headWidth/2) + (i * headWidth); // 将Tile添加到容器中 tileContainer.addChild(tile); } } } grid();
方案二:用数组存储后遍历处理
如果需要单独操作每个Tile,可以把生成的Tile存入数组,点击按钮时遍历数组逐个处理。
修改后的完整代码:
// 在函数外定义数组,确保hidetile能访问到 var tileArray:Array = []; function grid(): void { mc_gameover.btn_mainmenu.addEventListener(MouseEvent.CLICK, hidetile); function hidetile(event:MouseEvent):void { // 倒序遍历数组(避免移除元素时索引混乱) for(var k:int = tileArray.length - 1; k >= 0; k--){ var tile:Sprite = tileArray[k]; // 隐藏Tile tile.visible = false; // 如果要移除,添加:removeChild(tile); // 从数组中删除已处理的Tile tileArray.splice(k, 1); } } for(var i:int = 0; i < rows; i++){ for(var j:int = 0; j < columns; j++){ var tile:Sprite = new Tile(); // 从库中获取Tile元件 tile.x = (headWidth/2) + (j * headWidth); tile.y = (headWidth/2) + (i * headWidth); addChild(tile); // 将Tile存入数组 tileArray.push(tile); } } } grid();
两种方案对比:
- 容器方案更高效,适合大量Tile的场景,操作简单。
- 数组方案更灵活,后续需要单独修改某个Tile时,能直接从数组中获取。
内容的提问来源于stack exchange,提问作者webdog
相关产品推荐
相关产品推荐

