我正在创建一个flash应用程序,它使用了dropShadow过滤器和各种精灵的缩放。
其中谎言the problem:
此过滤器支持舞台缩放。 但是,它不支持一般 缩放,旋转和倾斜。如果 对象本身是缩放的(如果scaleX和 scaleY设置为除以外的值 1.0),过滤器没有缩放。
通过偶然的情况,缺乏旋转支持对我有利,但我真的非常需要缩放才能工作。这样做的最佳方法是什么?
我可以扩展DropShadow对象并“更新”吗?
我应该创建自己的自定义对象,只使用新的.distance值重新创建自己以匹配缩放级别吗?
什么是最好的使用方法(考虑到性能)?
答案 0 :(得分:1)
考虑到性能,您可以使用Bitmap
并将原始大小的容器及其DropShadowFilter
绘制到其上。这样,过滤器将缩放和 Flash甚至不必重新计算投影的渲染。
示例:
// We need to use this container as the source for the Bitmap.
var sample:Sprite = new Sprite();
// Sample object with DropShadowFilter applied.
var rect:Sprite = new Sprite();
rect.x = rect.y = 10;
rect.graphics.beginFill(0xCC0000);
rect.graphics.drawRect(0, 0, 50, 50);
rect.graphics.endFill();
rect.filters = [new DropShadowFilter()];
sample.addChild(rect);
// Create our Bitmap.
var bitmap:Bitmap = new Bitmap();
bitmap.x = bitmap.y = 100;
bitmap.bitmapData = new BitmapData(sample.width + 20, sample.height + 20, true);
bitmap.bitmapData.draw(sample);
bitmap.scaleX = bitmap.scaleY = 0.5;
addChild(bitmap);
答案 1 :(得分:0)
由于滤镜不缩放,因此其参数值必须始终对应于像素单位。因此,您只需缩放与对象相同的过滤器值。为此,只需将对象坐标系中的单位矢量(长度== 1)转换为全局坐标系,距离将是对象滤波器的全局比例因子。
每次对象移动或缩放时,请更改应缩放并重新应用滤镜的任何滤镜值。下面是一个示例文档类,显示了一个正方形,其中包含使用它进行缩放的发光和阴影滤镜,同时它嵌套在另一个缩放的容器中。我还添加了一个舞台调整大小的侦听器,以保持广场在舞台的中心。
将其粘贴到新文档主时间轴上的操作中并运行它。请注意,投影的距离和大小比例以及发光滤镜的模糊也会缩放。当你有不同的x和y模糊值时,你甚至可以添加数学来解释旋转。
import flash.display.Sprite;
import flash.filters.GlowFilter;
import flash.events.Event;
import flash.display.StageScaleMode;
import flash.utils.getTimer;
import flash.geom.Point;
import flash.filters.DropShadowFilter;
//Fix the scale of the stage
stage.scaleMode = flash.display.StageScaleMode.NO_SCALE;
stage.frameRate = 60;
//Create a small green square centered at the origin
var r:Sprite = new Sprite();
r.graphics.beginFill( 0x00ff00 );
r.graphics.drawRect( -5, -5, 10, 10 );
r.graphics.endFill();
//Nest it in a container
var container:Sprite = new Sprite();
container.addChild( r )
addChild( container );
//Apply a glow filter
var GLOW_BLUR:Number = 10;
var SHADOW_DIST:Number = 5;
var SHADOW_BLUR:Number = 2;
var dropshadow:DropShadowFilter = new DropShadowFilter( SHADOW_DIST, 45, 0, 1, SHADOW_BLUR, SHADOW_BLUR, 1, 3 ); //new GlowFilter( 0x000000, 0.5, GLOW_BLUR, GLOW_BLUR, 2, 3 );
var glow:GlowFilter = new GlowFilter( 0x0000ff, 1, GLOW_BLUR, GLOW_BLUR, 1, 3 ); //new GlowFilter( 0x000000, 0.5, GLOW_BLUR, GLOW_BLUR, 2, 3 );
r.filters = [glow,dropshadow];
addEventListener( Event.ENTER_FRAME, enterFrame, false, 0, true );
addEventListener( Event.RESIZE, stageResized, false, 0, true );
var t:int = getTimer();
stageResized( null );
function enterFrame( e:Event ):void
{
var cycle_length:Number = 2000;
var cycle:Number = (((getTimer() - t) % cycle_length) / cycle_length) * Math.PI * 2.0;
var scale:Number = 2 + Math.sin( cycle );
r.scaleX = r.scaleY = scale;
container.scaleX = container.scaleY = scale * 2;
container.rotation = cycle / (Math.PI / 180);
var p0:Point = new Point( 0, 0 );
var p1:Point = new Point( 1, 0 );
p0 = r.localToGlobal( p0 );
p1 = r.localToGlobal( p1 );
var globalScale:Number = Point.distance( p0, p1 );
dropshadow.blurX = dropshadow.blurY = SHADOW_BLUR * globalScale;
dropshadow.distance = SHADOW_DIST * globalScale;
glow.blurX = glow.blurY = GLOW_BLUR * globalScale;
r.filters = [glow,dropshadow];
}
function stageResized( e:Event ):void
{
container.x = (stage.stageWidth / 2);
container.y = (stage.stageHeight / 2);
}
答案 2 :(得分:-1)
我正在使用这样的dropShadow过滤器,并且缩放,旋转,倾斜工作正常:
var localFilters :Array = new Array();
localFilters.push( dropShadowFilter );
component.filters = localFilters;
之后如果您这样做:
var m:Matrix = new Matrix();
m.scale( 1.5, 2 );
component.transform.matrix = m;
dropShadow过滤器将被缩放。