【问题标题】:Sprite visibility problems after using low values of alpha使用低 alpha 值后的精灵可见性问题
【发布时间】:2015-07-04 18:38:35
【问题描述】:

计划非常简单:使用 MouseEvent.CLICK 隐藏/显示 Sprite。第一次点击应该让它消失,第二次让它再次可见。
实际发生的事情真的很奇怪,因为当 alpha 设置为 1 时 Sprite 不可见(除非我放大或打开“设置”菜单)。这是一个例子: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 社区寻求帮助(请参阅 cmets 获取链接)。

【问题讨论】:

  • 如果你的精灵的 alpha 为 0,你会点击什么?那时没有可见的精灵。
  • @Vesper 显示对象alpha 设置为 0 是活动的,即使它们是不可见的,这与使用 display_object.visible = false; 隐藏它不同。
  • @Stefano 我无法重现您所说的奇怪行为。尝试使用0.0 而不是01.0 而不是1 ...
  • @Vesper:是的。当我向 doStuff 函数添加跟踪时,显示的 alpha 值准确地反映了我预期会发生的情况,但不是视觉上的。
  • @akmozo:谢谢!我会尝试并报告。

标签: actionscript-3 alpha redraw


【解决方案1】:

经过多次测试(在带有 firefox、chrome 和 IE 的 windows 7 上),我可以确认“问题”(至少是异常行为)与这些因素有关:

  • 使用MovieClipSpriteShape(以及其他一些对象)。

  • wmode(使用时):directgpu

  • Flash Player 版本:ActiveXNPAPIStandalone(适用于 14 及更高版本) .

我认为这就像 Flash Player “忽略”渲染对象可能是因为这样做的性能问题(从第一次开始,当 alpha 为 0 时不渲染对象),因为有时当我使用 @ 987654321@ 或 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);

或者简单地说,避免使用directgpu wmodes ...

希望能有所帮助。

【讨论】:

  • 非常感谢您抽出宝贵时间帮助我破译问题。
  • 你所说的wmode 是有道理的,但在我的情况下,测试的 swf 没有嵌入到 html 页面上。可以肯定的是,我尝试在元标记上设置 wmode,但它什么也没做。
  • cacheAsBitmap 似乎是一个快速简便的解决方案,但后来我偶然发现了一篇通知the toll it takes on performance 的文章,并决定不冒险。该文章还建议将手动光栅化作为更好的选择。也许我稍后会测试它......
  • colorTransform 很棒,但实际上并非完全透明,对吧?当 alpha 为 0 时,它使用alphaOffset 添加少量不透明度,就像我提出的问题一样。您的解决方案的改进之处在于它设法以更小的true alpha(0.00390625 或 1/256)值解决了问题。我拍摄了两种解决方案的屏幕截图并稍微降低了亮度,因此“完全透明”的方块变得可见:i.imgur.com/yQDtm4F.png
  • 附录:在你第一次提到wmode 之后,我想出了另一个解决方法来解决这个问题,我现在将它添加到我们的堆栈中,只是为了记录:在构造函数中主类,使用stageWidthstageHeight 作为尺寸,在Main.graphics 上绘制一个白色(或您希望背景为任何颜色)的矩形。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2012-08-07
相关资源
最近更新 更多