ActionScript舞台绘制的线条切换帧时出现在前后相邻帧如何解决?
问题根因
- 你所有绘制的
Shape实例都直接添加到了stage根容器中,Flash/ActionScript3的时间轴帧切换逻辑只会自动管理当前时间轴层级的显示对象,挂载在stage层级的元素是全局生效的,不会随帧切换自动销毁或隐藏,因此所有历史绘制的线条会在所有帧都可见。 - 额外隐藏问题:当前代码仅保留了最后一次绘制的
Shape引用s,之前绘制的符合匹配条件的线条没有存储引用,后续即使要主动清理也无法定位到对应对象。
修复方案
- 首先创建线条专属显示容器,挂载到当前帧的时间轴而非全局
stage,帧切换时容器会跟随时间轴自动销毁,线条自然不会跨帧显示:
// 代码开头新增声明 var lineContainer:Sprite = new Sprite(); // 容器挂载到当前时间轴,不要加在stage上 addChild(lineContainer);
- 修改绘制逻辑,将新创建的线条添加到专属容器中:
function setP1(e:MouseEvent):void { p1.x=mouseX; p1.y=mouseY; stage.addEventListener(MouseEvent.MOUSE_MOVE, draw); s=new Shape(); // 替换原来的stage.addChild(s) lineContainer.addChild(s); }
- 若切换帧时不需要保留当前帧绘制的所有线条,可以在前后帧切换按钮的点击逻辑中主动清空容器:
// 你的帧切换按钮点击事件中新增以下代码 function onFrameSwitch(e:MouseEvent):void { // 切换帧前清空所有绘制的线条 lineContainer.removeChildren(); // 原有帧切换逻辑保留 }
- 可选优化:如果需要后续编辑匹配成功的线条,可以新增数组存储有效线条引用:
// 代码开头新增声明 var validLines:Array = []; // 修改原有end函数的匹配逻辑 function end(e:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, draw); if (MC_1.hitTestPoint(p1.x,p1.y) && MC_1_1.hitTestPoint(p2.x, p2.y)) { // 匹配成功的线条存入数组方便后续操作 validLines.push(s); } else { // 匹配失败直接移除线条实例,比仅清空图形更节省内存 lineContainer.removeChild(s); s = null; } }
内容的提问来源于stack exchange,提问作者Ahmed Mukhtar
相关产品推荐
相关产品推荐

