2010-03-14 25 views
1

我正在使用将视觉反射效果应用于定义的影片剪辑的类。 我使用从这里的反射级: link to source。 除了当我将旋转应用到动画片段时,它的作用就像一种魅力。 在我的情况下,反射仍然可见,但只是其中的一部分。 我在做什么错?我怎么能通过/包含旋转到Reflection-Class? 在此先感谢!actionscript3:reflection-class applied on rotationY

这是你如何运用的思考Class将您的影片剪辑:

var ref_mc:MovieClip = new MoviClip(); 
addChild(ref_mc); 
var r1:Reflect = new Reflect({mc:ref_mc, alpha:50, ratio:50,distance:0, updateTime:0,reflectionDropoff:1}); 

现在我申请一个旋转,我的影片剪辑:

ref_mc.rotationY = 30; 

这里的体现级:

package com.pixelfumes.reflect{ 
import flash.display.MovieClip; 
import flash.display.DisplayObject; 
import flash.display.BitmapData; 
import flash.display.Bitmap; 
import flash.geom.Matrix; 
import flash.display.GradientType; 
import flash.display.SpreadMethod; 
import flash.utils.setInterval; 
import flash.utils.clearInterval; 

public class Reflect extends MovieClip{ 
    //Created By Ben Pritchard of Pixelfumes 2007 
    //Thanks to Mim, Jasper, Jason Merrill and all the others who 
    //have contributed to the improvement of this class 

    //static var for the version of this class 
    private static var VERSION:String = "4.0"; 
    //reference to the movie clip we are reflecting 
    private var mc:MovieClip; 
    //the BitmapData object that will hold a visual copy of the mc 
    private var mcBMP:BitmapData; 
    //the BitmapData object that will hold the reflected image 
    private var reflectionBMP:Bitmap; 
    //the clip that will act as out gradient mask 
    private var gradientMask_mc:MovieClip; 
    //how often the reflection should update (if it is video or animated) 
    private var updateInt:Number; 
    //the size the reflection is allowed to reflect within 
    private var bounds:Object; 
    //the distance the reflection is vertically from the mc 
    private var distance:Number = 0; 


    function Reflect(args:Object){ 
     /*the args object passes in the following variables 
     /we set the values of our internal vars to math the args*/ 
     //the clip being reflected 
     mc = args.mc; 
     //the alpha level of the reflection clip 
     var alpha:Number = args.alpha/100; 
     //the ratio opaque color used in the gradient mask 
     var ratio:Number = args.ratio; 
     //update time interval 
     var updateTime:Number = args.updateTime; 
     //the distance at which the reflection visually drops off at 
     var reflectionDropoff:Number = args.reflectionDropoff; 
     //the distance the reflection starts from the bottom of the mc 
     var distance:Number = args.distance; 

     //store width and height of the clip 
     var mcHeight = mc.height; 
     var mcWidth = mc.width; 

     //store the bounds of the reflection 
     bounds = new Object(); 
     bounds.width = mcWidth; 
     bounds.height = mcHeight; 

     //create the BitmapData that will hold a snapshot of the movie clip 
     mcBMP = new BitmapData(bounds.width, bounds.height, true, 0xFFFFFF); 
     mcBMP.draw(mc); 

     //create the BitmapData the will hold the reflection 
     reflectionBMP = new Bitmap(mcBMP); 
     //flip the reflection upside down 
     reflectionBMP.scaleY = -1; 
     //move the reflection to the bottom of the movie clip 
     reflectionBMP.y = (bounds.height*2) + distance; 

     //add the reflection to the movie clip's Display Stack 
     var reflectionBMPRef:DisplayObject = mc.addChild(reflectionBMP); 
     reflectionBMPRef.name = "reflectionBMP"; 

     //add a blank movie clip to hold our gradient mask 
     var gradientMaskRef:DisplayObject = mc.addChild(new MovieClip()); 
     gradientMaskRef.name = "gradientMask_mc"; 

     //get a reference to the movie clip - cast the DisplayObject that is returned as a MovieClip 
     gradientMask_mc = mc.getChildByName("gradientMask_mc") as MovieClip; 
     //set the values for the gradient fill 
     var fillType:String = GradientType.LINEAR; 
     var colors:Array = [0xFFFFFF, 0xFFFFFF]; 
     var alphas:Array = [alpha, 0]; 
     var ratios:Array = [0, ratio]; 
     var spreadMethod:String = SpreadMethod.PAD; 
     //create the Matrix and create the gradient box 
     var matr:Matrix = new Matrix(); 
     //set the height of the Matrix used for the gradient mask 
     var matrixHeight:Number; 
     if (reflectionDropoff<=0) { 
      matrixHeight = bounds.height; 
     } else { 
      matrixHeight = bounds.height/reflectionDropoff; 
     } 
     matr.createGradientBox(bounds.width, matrixHeight, (90/180)*Math.PI, 0, 0); 
     //create the gradient fill 
     gradientMask_mc.graphics.beginGradientFill(fillType, colors, alphas, ratios, matr, spreadMethod); 
     gradientMask_mc.graphics.drawRect(0,0,bounds.width,bounds.height); 
     //position the mask over the reflection clip    
     gradientMask_mc.y = mc.getChildByName("reflectionBMP").y - mc.getChildByName("reflectionBMP").height; 
     //cache clip as a bitmap so that the gradient mask will function 
     gradientMask_mc.cacheAsBitmap = true; 
     mc.getChildByName("reflectionBMP").cacheAsBitmap = true; 
     //set the mask for the reflection as the gradient mask 
     mc.getChildByName("reflectionBMP").mask = gradientMask_mc; 

     //if we are updating the reflection for a video or animation do so here 
     if(updateTime > -1){ 
      updateInt = setInterval(update, updateTime, mc); 
     } 
    } 


    public function setBounds(w:Number,h:Number):void{ 
     //allows the user to set the area that the reflection is allowed 
     //this is useful for clips that move within themselves 
     bounds.width = w; 
     bounds.height = h; 
     gradientMask_mc.width = bounds.width; 
     redrawBMP(mc); 
    } 
    public function redrawBMP(mc:MovieClip):void { 
     // redraws the bitmap reflection - Mim Gamiet [2006] 
     mcBMP.dispose(); 
     mcBMP = new BitmapData(bounds.width, bounds.height, true, 0xFFFFFF); 
     mcBMP.draw(mc); 
    } 
    private function update(mc):void { 
     //updates the reflection to visually match the movie clip 
     mcBMP = new BitmapData(bounds.width, bounds.height, true, 0xFFFFFF); 
     mcBMP.draw(mc); 
     reflectionBMP.bitmapData = mcBMP; 
    } 
    public function destroy():void{ 
     //provides a method to remove the reflection 
     mc.removeChild(mc.getChildByName("reflectionBMP")); 
     reflectionBMP = null; 
     mcBMP.dispose(); 
     clearInterval(updateInt); 
     mc.removeChild(mc.getChildByName("gradientMask_mc")); 
    } 
} 

}

回答

0

如果您已设置的高度和你的位图数据的宽度到您反映影片剪辑的相同的宽度和高度,你会得到“切断”

当你旋转你的影片剪辑,它确实有效地变得更宽...和更高 - 当然在这一点上,你已经在设置的宽度上创建了bitmapData画布区域 -

你需要做什么它收集旋转动画片段的真正宽度和高度,并且当你重绘bitmapData,使用新的值。

我做了同样的事情,并使得我的bitmapData 1.5(bounds.width * 1.5)乘以movieclip的大小,我被骗了。但那是一个黑客,我是一个坏人。

0

我明白了,我必须重置反射界限: myReflectClass.setBounds(newWidth,newHeight);