SWFLite加载MovieClip设置cacheAsBitmap后消失的技术求助
解决SWFLite加载MovieClip遮罩后
cacheAsBitmap不显示的问题 看起来你遇到了遮罩后的MovieClip开启缓存就消失的典型问题,我来帮你拆解原因和解决办法:
核心原因分析
当你用squareToRound创建新容器并添加遮罩后,立刻设置cacheAsBitmap=true大概率是因为缓存时机不对——对象还没完成遮罩的渲染流程,就被强制生成了空的位图缓存;另外也可能是你的遮罩逻辑本身存在层级或尺寸的问题,导致缓存时无法正确捕捉到渲染内容。
具体解决步骤
1. 先确认遮罩逻辑的正确性
首先要保证squareToRound函数里的容器、原对象、遮罩的层级和尺寸是正确的,比如你的遮罩函数应该遵循这个逻辑:
function squareToRound(source:MovieClip):MovieClip { var container:MovieClip = new MovieClip(); // 关键:容器尺寸必须和原对象一致,否则缓存范围不对 container.width = source.width; container.height = source.height; // 把原对象添加到容器 container.addChild(source); // 创建遮罩形状(以圆形为例) var maskShape:Shape = new Shape(); maskShape.graphics.beginFill(0x000000); maskShape.graphics.drawCircle(source.width/2, source.height/2, source.width/2); maskShape.graphics.endFill(); // 遮罩必须和被遮罩对象在同一容器下 container.addChild(maskShape); // 给原对象设置遮罩,而非容器本身 source.mask = maskShape; return container; }
如果遮罩对象和被遮罩对象不在同一个容器,或者容器尺寸没匹配,缓存时就会出现空白。
2. 延迟设置缓存,确保渲染完成
刚把对象添加到舞台就设置cacheAsBitmap,Flash的渲染管线还没来得及处理遮罩和对象的绘制,导致缓存的位图是空的。可以延迟一帧再设置缓存:
var icon:MovieClip = Assets.getBattleAbility(ability.id); icon = squareToRound(icon); add(icon, treeAbX(ability.j), treeAbY(ability.i)); // 延迟一帧,等渲染完成后再缓存 icon.addEventListener(Event.ENTER_FRAME, function(e:Event):void { icon.removeEventListener(Event.ENTER_FRAME, arguments.callee); icon.cacheAsBitmap = true; });
3. 点击监听器中设置缓存的注意事项
如果是在点击事件里设置cacheAsBitmap=true,要注意先取消之前的缓存(如果有的话),避免缓存冲突:
icon.addEventListener(MouseEvent.CLICK, onIconClick); function onIconClick(e:MouseEvent):void { var targetClip:MovieClip = e.currentTarget as MovieClip; // 先取消旧缓存,确保修改能生效 targetClip.cacheAsBitmap = false; // 这里可以插入你的点击后逻辑,比如修改遮罩、调整对象内容等 // 重新开启缓存 targetClip.cacheAsBitmap = true; }
额外排查点
- 检查原MovieClip的尺寸:如果
Assets.getBattleAbility返回的对象宽高为0,缓存后自然看不到,建议打印icon.width和icon.height确认。 - 确认遮罩对象的可见性:遮罩本身不需要显示,但如果设置了
maskShape.visible = false,会导致遮罩失效,进而让对象显示异常。
内容的提问来源于stack exchange,提问作者Gulvan
相关产品推荐
相关产品推荐

