屏蔽如何在ActionScript 3中不起作用?

时间:2014-04-30 12:18:46

标签: actionscript-3 mask

我想屏蔽我的DisplayObject树的一些节点。我无法在我的大项目中进行掩蔽工作。所以我为我建立了一个简单的例子,我看到它的效果非常好。但我无法弄清楚为什么它在我的大项目中不起作用。我的所有可见对象都是Sprite,或者来自扩展Sprite的类。

  • 在大项目中掩盖并不起作用
    • 我可以看到nodeToBeMasked
    • 的正常状态
    • 当我将遮罩添加到此节点时,我可以看到遮罩
    • 但是当我将面具设置为面具时,我会继续看到所有内容(纯nodeToBeMasked被屏蔽但不是孩子 - 这将更加重要)
  • 简单示例中的掩码正常工作

屏蔽如何停止工作?

<小时/> 代码: (不起作用,大项目)

// custom class extends Sprite
override protected function onAddToStage(event:Event):void 
{
    trace(stage); // stage exists

    var maskSprite:Sprite = new Sprite();
    maskSprite.graphics.beginFill(0xffff00, 1);
    maskSprite.graphics.drawCircle(0, 0, 64);
    maskSprite.graphics.endFill();
    maskSprite.x = 64;
    maskSprite.y = 64;

    if (true)
    {
        this.addChild(maskSprite); // doesn't help
        this.mask = maskSprite; // I can see EVERYTHING here, inside and outside the cirle
    }
    else
        addChild(maskSprite); // I can see the mask here
}

代码: (有效)

[SWF(frameRate="60",backgroundColor="0xffffff",width="128",height="128")]
public class MaskTest extends Sprite
{
    public function MaskTest()
    {
        addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
    }

    private function onAddedToStage(event: Event): void
    {
        trace(stage);

        // this
        graphics.beginFill(0x00ff00, 1);
        graphics.drawRect(8, 8, 112, 112);
        graphics.endFill();
        // extra childs <- ^^
        for (var i: int = 0; i < 100; i++)
        {
            var child: Sprite = new Sprite();
            child.graphics.beginFill(uint(Math.random() * 0x1000000), 1);
            child.graphics.drawRect(Math.random() * 64, Math.random() * 64, 64, 64);
            child.graphics.endFill();
            addChild(child);
        }

        // mask
        var maskSprite: Sprite = new Sprite();
        maskSprite.graphics.beginFill(0xffff00, 1);
        maskSprite.graphics.drawCircle(0, 0, 64);
        maskSprite.graphics.endFill();
        maskSprite.x = 64;
        maskSprite.y = 64;

        // switch to check the mask
        if (true)
            this.mask = maskSprite;
        else
            addChild(maskSprite);
    }
}

更新

我发现我的自定义类(它是root,只负责Event.ENTER_FRAME更新)导致了问题。我不知道为什么,但是通过在我的所有项目中禁用z更新解决了maskedNode未被屏蔽的孩子。

2 个答案:

答案 0 :(得分:1)

必须将掩码添加到父级才能工作,不仅用作

obj.mask = myMask; //This will not work alone

要使其正常工作,必须将其添加到父对象显示列表

obj.addChild(myMask);
obj.mask = myMask;

答案 1 :(得分:1)

// this was the problem in my big project
maskSprite.z = 0; // avoid this with masks

我只是一个疯狂的猜测:
如果您使用属性zrotationXrotationYrotationZ(也许更多)精灵被转移到3D空间,而掩模只能在2D中工作。

我已经尝试了一下Flash 3D。从2D到3D的过渡看起来非常流畅。你无法看到他们何时“转身”。