Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 actionscript 3.0在可见遮罩对象上的可见遮罩_Actionscript 3_Mask - Fatal编程技术网

Actionscript 3 actionscript 3.0在可见遮罩对象上的可见遮罩

Actionscript 3 actionscript 3.0在可见遮罩对象上的可见遮罩,actionscript-3,mask,Actionscript 3,Mask,我的游戏中有一辆移动的卡车,我希望当它移动时,城市灯光的反射(而不是背景)在它的身体上是可见的 卡车后面是什么并不重要,一些树木和建筑物 所以, 我添加了背景(不重要); 然后我将卡车添加到舞台上; 然后我添加了另一个与整个舞台(城市灯光和其他东西)大小相同的MovieClip,并将其设置为卡车的遮罩对象 我不希望卡车消失,我只希望掩蔽物以某种透明度出现在卡车上方 我知道如何掩蔽,也知道如何将我的电影嘴唇捕捉为位图,但这在我的情况下不起作用;因为这里卡车保持完全可见,遮罩保持半透明 请帮帮我,我

我的游戏中有一辆移动的卡车,我希望当它移动时,城市灯光的反射(而不是背景)在它的身体上是可见的

卡车后面是什么并不重要,一些树木和建筑物

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

我不希望卡车消失,我只希望掩蔽物以某种透明度出现在卡车上方

我知道如何掩蔽,也知道如何将我的电影嘴唇捕捉为位图,但这在我的情况下不起作用;因为这里卡车保持完全可见,遮罩保持半透明

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

编辑

以下是我当前基于其中一个ASNWER的代码:

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)
}
var buildingHolder:Sprite=新Sprite;
这个.addChild(buildingHolder);
变量掩码:Sprite=新Sprite()
蒙版=精灵(buildingHolder);
α=1;
Mask.cacheAsBitmap=true;
这个.addChild(面具);
var反射:MovieClip=新夜空1任务;
反射系数x=0;
反射系数y=480;
α=0.6;
reflection.scaleX*=320/reflection.width;
reflection.scaleY=reflection.scaleX;
reflection.cacheAsBitmap=true;
反射.遮罩=遮罩;
这个.addChild(反射);

对于(var i:int=0;i您不想遮罩卡车。您想遮罩的是城市灯光

您需要创建卡车的副本,并使用该副本遮罩城市灯光

假设库中有一个位图,导出的类为
TruckImage
,而actionscript的灯光导出为
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=newsprite();
这个.addChild(buildingHolder);
//创建一个位图数据对象并将建筑支架精灵绘制到其中(制作副本)
var maskBMD:BitmapData=新的BitmapData(buildingHolder.width,buildingHolder.height,true,0x00000000);
maskBMD.draw(buildingHolder);
var msk:Bitmap=新位图(maskBMD,“自动”,true);
msk.cacheAsBitmap=true;
这个.addChild(msk);
var反射:MovieClip=新夜空1任务;
反射系数x=0;
反射系数y=480;
α=0.6;
reflection.scaleX*=320/reflection.width;
reflection.scaleY=reflection.scaleX;
reflection.cacheAsBitmap=true;
reflection.mask=msk;
这个.addChild(反射);

对于(var i:int=0;我显示您当前的代码。您需要为城市灯光MovieClip创建一个遮罩,因为您不想遮罩卡车,您想遮罩灯光。如果您的卡车是一个png或bimtap类型的透明对象,那么创建一个可以作为灯光遮罩的副本非常容易。如果您显示代码,一个特定的可以给出足够的例子。我认为这里的问题是,这个蒙版本身就是buildingHolder,我的意思是,当我将其alpha设置为0.1时,我看不到它后面的buildingHolder。它们完全相同而不是复制!@LDMSYes,投射对象不会复制它。你正在做的是创建一个新的精灵(在蒙版变量中),然后马上给变量分配buildingHolder变量中的同一个对象。一个对象,两个变量引用它。我非常感谢;不幸的是,出于可猜测的原因,我绝对不能显示代码!如果你想知道事实,根本没有卡车,有一系列的movieclips(建筑物的一部分)在物理引擎的基础上移动。它们都被添加到名为buildingHolder的单个精灵中。随着建筑部分的移动和晃动,城市的灯光必须在这座建筑(有玻璃窗)上可见为了让你有一种反射的感觉。我将尝试看看你的代码是否能在我的情况下工作并更新你。再次感谢你。我刚刚遇到的第一个问题是,正如我所说的,所有这些部分都在一个精灵中,例如mySprite.bitmapData将不起作用。我如何制作一个精灵的副本,其中所有的子元素都会随着时间移动bitmapData?你如何实例化所说的精灵?是通过代码还是通过将其放在时间轴上?是通过代码。但现在这并不重要,因为我制作了一个面具作为我的建筑支架的副本,反射现在遮住了我的面具;正如你所说,它完全遮住了,但还有另一个问题;建筑本身就是不再可见。我只看到灯光(反射)。我将在下面编写一些代码,但不知道如何在这里按格式编写代码!怎么做?用反勾号`(与tilda相同的键~)包装代码。是的,如果通过代码进行操作,您可以实例化另一个副本并将其用作遮罩-基本上与我的示例相同,仅使用精灵而不是位图数据)。您可能只需要在反射上设置alpha。
lights.alpha=.2
或差不多
    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;
    }