使用低 alpha 值后的精灵可见性问题
Sprite visibility problems after using low values of alpha
计划非常简单:使用 MouseEvent.CLICK 到 hide/show 雪碧。第一次点击应该让它消失,第二次点击让它再次可见。
实际发生的事情真的很奇怪,因为当 alpha 设置为 1 时精灵不可见(除非我放大或打开“设置”菜单)。这是一个示例:http://www.fastswf.com/8BuuY14
private function doStuff(e:MouseEvent):void {
(e.target.alpha == 1) ? e.target.alpha = 0 : e.target.alpha = 1;
}
//Sprite on the left
var outter:Sprite = new Sprite(); //Container sprite (gray background)
outter.x = outter.y = 20;
outter.opaqueBackground = 0xCCCCCC;
outter.addEventListener(MouseEvent.CLICK, doStuff);
var inner:Sprite = new Sprite(); //Interactive child (red square)
inner.graphics.beginFill(0xFF0000);
inner.graphics.drawRect(0, 0, 50, 50);
var speck:Shape = new Shape(); //Reference child (tiny black square)
speck.graphics.beginFill(0x000000);
speck.graphics.drawRect(50, 50, 5, 5);
outter.addChild(inner);
outter.addChild(speck);
addChild(outter);
//Sprite on the right
var cont:Sprite = new Sprite();
cont.x = 100; cont.y = 20;
cont.graphics.beginFill(0xFF0000);
cont.graphics.drawRect(0, 0, 50, 50);
cont.addEventListener(MouseEvent.CLICK, doStuff);
addChild(cont);
我确实成功了,通过使用等于或大于 0.0078125(在 true alpha value 中)但不是 0 的 alpha 值。为什么会这样?
[编辑]
由于我确定错误可能是由我的 IDE 引起的,因此我也在 FlashDevelop 社区请求帮助(请参阅 link 的评论)。
经过多次测试(在 windows 7 上使用 firefox、chrome 和 IE),我可以确认 "problem"(异常行为,至少)与这些有关因素:
使用 MovieClip
、Sprite
或 Shape
(以及其他一些对象)。
wmode
(使用时):direct和gpu.
Flash Player 版本:ActiveX、NPAPI 和 Standalone 14 及更高版本.
我认为 Flash Player "ignoring" 渲染对象可能是为了性能问题(从第一次开始当它的 alpha 为 0 时不渲染对象),因为有时当我使用了 Button
or CheckBox
, ... 然后翻转它,在对象上触发了一个 Event.RENDER
事件并且代码运行了一次。我还看到代码在同时为两个对象执行时有效...
所以为了避免这种行为,你可以使用 cacheAsBitmap
属性 :
object.cacheAsBitmap = true;
您还可以在设置 alpha
时使用 ColorTransform
对象:
object.transform.colorTransform = new ColorTransform(1, 1, 1, (object.alpha == 1 ? 0 : 1), 0, 0, 0, 1);
或者简单地说,避免使用 direct
或 gpu
w模式 ...
希望能帮到你。
计划非常简单:使用 MouseEvent.CLICK 到 hide/show 雪碧。第一次点击应该让它消失,第二次点击让它再次可见。
实际发生的事情真的很奇怪,因为当 alpha 设置为 1 时精灵不可见(除非我放大或打开“设置”菜单)。这是一个示例:http://www.fastswf.com/8BuuY14
private function doStuff(e:MouseEvent):void {
(e.target.alpha == 1) ? e.target.alpha = 0 : e.target.alpha = 1;
}
//Sprite on the left
var outter:Sprite = new Sprite(); //Container sprite (gray background)
outter.x = outter.y = 20;
outter.opaqueBackground = 0xCCCCCC;
outter.addEventListener(MouseEvent.CLICK, doStuff);
var inner:Sprite = new Sprite(); //Interactive child (red square)
inner.graphics.beginFill(0xFF0000);
inner.graphics.drawRect(0, 0, 50, 50);
var speck:Shape = new Shape(); //Reference child (tiny black square)
speck.graphics.beginFill(0x000000);
speck.graphics.drawRect(50, 50, 5, 5);
outter.addChild(inner);
outter.addChild(speck);
addChild(outter);
//Sprite on the right
var cont:Sprite = new Sprite();
cont.x = 100; cont.y = 20;
cont.graphics.beginFill(0xFF0000);
cont.graphics.drawRect(0, 0, 50, 50);
cont.addEventListener(MouseEvent.CLICK, doStuff);
addChild(cont);
我确实成功了,通过使用等于或大于 0.0078125(在 true alpha value 中)但不是 0 的 alpha 值。为什么会这样?
[编辑]
由于我确定错误可能是由我的 IDE 引起的,因此我也在 FlashDevelop 社区请求帮助(请参阅 link 的评论)。
经过多次测试(在 windows 7 上使用 firefox、chrome 和 IE),我可以确认 "problem"(异常行为,至少)与这些有关因素:
使用
MovieClip
、Sprite
或Shape
(以及其他一些对象)。wmode
(使用时):direct和gpu.Flash Player 版本:ActiveX、NPAPI 和 Standalone 14 及更高版本.
我认为 Flash Player "ignoring" 渲染对象可能是为了性能问题(从第一次开始当它的 alpha 为 0 时不渲染对象),因为有时当我使用了 Button
or CheckBox
, ... 然后翻转它,在对象上触发了一个 Event.RENDER
事件并且代码运行了一次。我还看到代码在同时为两个对象执行时有效...
所以为了避免这种行为,你可以使用 cacheAsBitmap
属性 :
object.cacheAsBitmap = true;
您还可以在设置 alpha
时使用 ColorTransform
对象:
object.transform.colorTransform = new ColorTransform(1, 1, 1, (object.alpha == 1 ? 0 : 1), 0, 0, 0, 1);
或者简单地说,避免使用 direct
或 gpu
w模式 ...
希望能帮到你。