actionscript 3.0 可见遮罩覆盖可见遮罩 object

actionscript 3.0 visible mask over a visible masked object

我的游戏中有一辆移动的卡车,我希望城市灯光反射(不是背景)在它四处移动时在其 body 上可见。

卡车后面站什么无所谓,一些树木和建筑物。

所以, 我添加背景(不重要); 然后我将卡车添加到舞台上; 然后我添加另一个具有整个舞台大小(城市灯光和其他东西)的 MovieClip,并将其设置为我的卡车的遮罩 object。

我不希望卡车消失,我只希望掩蔽 object 以某种透明度显示在它上面;

我知道如何使用遮罩并将我的影片剪辑捕捉为位图,但它对我来说不起作用;因为在这里卡车完全可见,面具 semi-transparent.

请帮帮我,我 运行 没时间了:/

编辑

这是我当前的代码,基于其中一个答案:

var buildingHolder: Sprite = new Sprite;
this.addChild(buildingHolder);

var Mask: Sprite = new Sprite()
Mask = Sprite(buildingHolder);
Mask.alpha = 1;
Mask.cacheAsBitmap = true;
this.addChild(Mask);

var reflection: MovieClip = new nightSky1Mask;
reflection.x = 0;
reflection.y = 480;
reflection.alpha = .6;
reflection.scaleX *= 320 / reflection.width;
reflection.scaleY = reflection.scaleX;
reflection.cacheAsBitmap = true;
reflection.mask = Mask;
this.addChild(reflection);

for (var i: int = 0; i <= 29; i++){
//some codes are deleted here

    var image: MovieClip = new level1Images[i];
    image.x = // deleted
    image.y = // deleted
    image.scaleX *= 30 / image.width * 2;
    image.scaleY *= 5 / image.width * 2;
    buildingHolder.addChild(image)
    currLevelImages.push(image)
}

想要遮盖卡车。你要遮掩的是城市的灯光

您需要创建卡车的副本,并用它遮盖城市的灯光。

假设您的库中有一个位图,导出 class 为 TruckImage,并且您的灯光为动作脚本导出为 Lights,您可以这样做:

var truck:Bitmap = new Bitmap(new TruckImage());

//scale and position however you'd like
truck.scaleX = truck.scaleY = .25;
truck.y = 100;
addChild(truck);    

var theMask:Bitmap = new Bitmap(truck.bitmapData);
theMask.cacheAsBitmap = true;//!very important
theMask.scaleX = theMask.scaleY = truck.scaleX;
addChild(theMask); //also important

lights = new Bitmap(new Lights());
lights.cacheAsBitmap = true;//!very important
lights.mask = theMask;
addChild(lights);

//let's move the truck and the mask every frame
addEventListener(Event.ENTER_FRAME,enterFrame);
function enterFrame(e:Event):void {
    truck.x = (truck.x + 2) % stage.stageWidth;
    theMask.x = truck.x;
}

编辑

尝试这样的事情:(创建您的建筑物的位图副本)

    var buildingHolder:Sprite = new Sprite();
    this.addChild(buildingHolder);

    //create a bitmap data object and draw the building holder sprite into it (making a copy)
    var maskBMD:BitmapData = new BitmapData(buildingHolder.width,buildingHolder.height,true,0x00000000);
    maskBMD.draw(buildingHolder);

    var msk:Bitmap = new Bitmap(maskBMD,"auto",true);
    msk.cacheAsBitmap = true;
    this.addChild(msk);

    var reflection:MovieClip = new nightSky1Mask;
    reflection.x = 0;
    reflection.y = 480;
    reflection.alpha = .6;
    reflection.scaleX *= 320 / reflection.width;
    reflection.scaleY = reflection.scaleX;
    reflection.cacheAsBitmap = true;
    reflection.mask = msk;
    this.addChild(reflection);

    for (var i: int = 0; i <= 29; i++){
    //some codes are deleted here

        var image: MovieClip = new level1Images[i];
        image.x = // deleted
        image.y = // deleted
        image.scaleX *= 30 / image.width * 2;
        image.scaleY *= 5 / image.width * 2;
        buildingHolder.addChild(image)
        currLevelImages.push(image)
    }

或者,您可以像这样为您的建筑制作两个副本:

    var buildingHolder:Sprite = createBuilding();
    var buildingHolderMask:Sprite = createBuilding(false);

    function createBuilding(addToArray:Boolean = true):Sprite {
        var building:Sprite = new Sprite();

        for (var i: int = 0; i <= 29; i++){
        //some codes are deleted here

            var image: MovieClip = new level1Images[i];
            image.x = // deleted
            image.y = // deleted
            image.scaleX *= 30 / image.width * 2;
            image.scaleY *= 5 / image.width * 2;
            building.addChild(image)
            if(addToArray) currLevelImages.push(image)
        }
        return building;
    }