2013-04-30 77 views
0

这可能是一个愚蠢的问题,因为我是flash专业版的新手,并且不知道太多。 所以我有一个框架与一些行动脚本(AS3)和这个脚本运行不断一旦开始。我想要的是一种停止脚本并继续播放电影的方法。例如,脚本只能在50-100帧之间运行。这怎么可能?闪光灯 - 设置帧数后停止AS3

var sw = 496; 
var sh = 445; 

var lightRadius:Number; 
var frontLight:Sprite; 
var backLight:Sprite; 
var blur:BlurFilter; 
var textClip:mcText; 
var textClipMask:mcText; 
var textClipShadow:mcText; 
var offsetX:Number; 
var offsetY:Number; 
var angle:Number; 
var scaleFactor:Number; 
var blackRectangle:Sprite; 
var lightAndDark:Sprite; 
var textAndLightHolder:Sprite; 
var spotWidth:Number; 
var spotHeight:Number; 
var ambientShade:uint; 
var lightOnBackWallColor:uint; 

var oscillationAmplitude:Number; 

init(); 

function init():void { 

lightRadius = 50; 

spotWidth = 80; 
spotHeight = 80; 

offsetX = 0; 
offsetY = -25; 
scaleFactor = 1.25; 

/* 
We define colors below. 

The ambientShade is best set to a gray value. By multiplication of color values, it 
controls how dark the text will be when it is not illuminated by the spotlight. 
Setting ambientShade to 0x000000 (black) will cause the text to be completely invisible 
when not illuminated. 

The wall in the background can appear to have its own color, 
by setting lightOnBackWallColor. If lightOnBackWallColor is set to a dull gray as 
we have done below, the effect is of a diffused light. 
*/ 
ambientShade = 0x111111; 
lightOnBackWallColor = 0x444444; 

textClip = new mcText(); 
textClip.x = sw/2; 
textClip.y = sh/2; 

textClipMask = new mcText(); 
textClipMask.x = sw/2; 
textClipMask.y = sh/2; 

textClipShadow = new mcText(); 
textClipShadow.scaleX = textClipShadow.scaleY = scaleFactor; 
textClipShadow.transform.colorTransform = new ColorTransform(0,0,0,1); 
var shadowBlur:BlurFilter = new BlurFilter(6,6); 
shadowBlur.quality = BitmapFilterQuality.HIGH; 
textClipShadow.filters = [shadowBlur]; 
textClipShadow.x = textClip.x + offsetX; 
textClipShadow.y = textClip.y + offsetY; 

var matrix:Matrix = new Matrix(); 
matrix.createGradientBox(2*spotWidth,2*spotHeight,0,-spotWidth,-spotHeight); 
frontLight = new Sprite(); 
frontLight.graphics.beginGradientFill("radial",[0xFFFFFF,ambientShade],[1,1],[64,255],matrix); 
frontLight.graphics.drawEllipse(-spotWidth,-spotHeight,2*spotWidth,2*spotHeight); 
frontLight.graphics.endFill(); 

matrix = new Matrix(); 
matrix.createGradientBox(2*scaleFactor*spotWidth,2*scaleFactor*spotHeight,0,-scaleFactor*spotWidth,-scaleFactor*spotHeight); 
backLight = new Sprite(); 
backLight.graphics.beginGradientFill("radial",[lightOnBackWallColor,0x000000],[1,1],[32,255],matrix); 
backLight.graphics.drawEllipse(-scaleFactor*spotWidth,-scaleFactor*spotHeight,2*scaleFactor*spotWidth,2*scaleFactor*spotHeight); 
backLight.graphics.endFill(); 

frontLight.x = sw/2; 
frontLight.y = sh/2; 
backLight.x = frontLight.x + offsetX; 
backLight.y = frontLight.y + offsetY; 

blackRectangle = new Sprite(); 
blackRectangle.graphics.beginFill(ambientShade); 
var rect = textClip.getBounds(textClip); 
blackRectangle.graphics.drawRect(rect.left-2, rect.top-2, rect.width+4, rect.height+4); 
blackRectangle.graphics.endFill(); 
blackRectangle.x = sw/2; 
blackRectangle.y = sh/2; 

lightAndDark = new Sprite(); 
lightAndDark.addChild(blackRectangle); 
lightAndDark.addChild(frontLight); 


lightAndDark.blendMode = BlendMode.MULTIPLY; 

textAndLightHolder = new Sprite(); 

this.addChild(backLight); 
this.addChild(textClipShadow); 
this.addChild(textAndLightHolder); 
textAndLightHolder.addChild(textClip); 
textAndLightHolder.addChild(lightAndDark); 
this.addChild(textClipMask); 

textAndLightHolder.mask = textClipMask; 

oscillationAmplitude = (sw/2 - backLight.width/2)/scaleFactor - 2; 

this.addEventListener(Event.ENTER_FRAME, onEnter); 
} 

function onEnter(evt:Event):void { 
frontLight.x = 0.5*sw - oscillationAmplitude*Math.cos(getTimer()*0.0005); 
backLight.x = 0.5*sw - scaleFactor*(0.5*sw-frontLight.x) + offsetX; 
} 
+0

什么是脚本做什么呢?你在谈论一个输入帧监听器(每帧功能更新)吗? – 2013-04-30 15:32:31

+0

感谢您的回复。它做了一些我不明白的东西,我从http://www.flashandmath.com/intermediate/spot/index.html – user1130820 2013-04-30 15:49:29

+0

得到它显示你的代码。你可以在你的输入框架句柄的顶部做什么,就像'if(currentFrame <50 && currentFrame> 100)return;'。如果你不在50和100之间的帧上,则该行退出函数 – BadFeelingAboutThis 2013-04-30 15:55:13

回答

0

由于该项目实际上并未使用框架,因此您可以设置一个计数器,并在调用输入框架事件时增加计数。尝试下面的解决方案。将200更改为您想要的号码。您可以trace(counter)太多,如果你喜欢

var sw = 600; 
var sh = 320; 

var lightRadius:Number; 
var frontLight:Sprite; 
var backLight:Sprite; 
var blur:BlurFilter; 
var textClip:mcText; 
var textClipAmbient:mcText; 
var textClipShadow:mcText; 
var offsetX:Number; 
var offsetY:Number; 
var angle:Number; 
var scaleFactor:Number; 
var textCenterX:Number; 
var textCenterY:Number; 
var illuminatedTextColor:uint; 
var ambientColor:uint; 
var lightOnBackWallColor:uint; 
var counter:Number = 0; //-- Define a variable, counter 

init(); 

function init():void { 

    textCenterX = sw/2; 
    textCenterY = sh/2 - 10; 

    lightRadius = 53; 

    /* 
    We define colors below. 
    illuminatedTextColor is the color of the text when it is fully 
    illuminated by the spotlight. 

    The ambient color is the color of the text when it is not illuminated. 
    Setting ambient color to 0x000000 (black) makes the text completely invisible when 
    not under the spotlight. 

    The wall in the background can appear to have its own color, 
    by setting lightOnBackWallColor. If lightOnBackWallColor is set to a dull gray as 
    we have done above, the effect is of a diffused light. 
    */ 
    ambientColor = 0x000000; 
    illuminatedTextColor = 0xFFFFFF; 
    lightOnBackWallColor = 0x555555; 

    //Try different colors to see the effect: 
    //ambientColor = 0x181111; 
    //illuminatedTextColor = 0xFF4444; 
    //lightOnBackWallColor = 0x556066; 

    //the offset parameters determine where the shadow will lie. 
    //The scaleFactor determines how large the shadow will be compared to 
    //the text. A large shadow suggests a wall further back (or the light being closer). 
    offsetX = 0; 
    offsetY = -40; 
    scaleFactor = 1.25; 

    textClip = new mcText(); 
    textClip.x = textCenterX; 
    textClip.y = textCenterY; 

    textClipAmbient = new mcText(); 
    textClipAmbient.x = textClip.x; 
    textClipAmbient.y = textClip.y; 
    var red:Number = (ambientColor >> 16); 
    var green:Number = (ambientColor >> 8) & 0xFF; 
    var blue:Number = ambientColor & 0xFF; 
    textClipAmbient.transform.colorTransform = new ColorTransform(0,0,0,1,red,green,blue); 

    textClipShadow = new mcText(); 
    textClipShadow.scaleX = textClipShadow.scaleY = scaleFactor; 
    textClipShadow.transform.colorTransform = new ColorTransform(0,0,0,1); 
    var shadowBlur:BlurFilter = new BlurFilter(5,5); 
    shadowBlur.quality = BitmapFilterQuality.HIGH; 
    textClipShadow.filters = [shadowBlur]; 
    textClipShadow.x = textClip.x + offsetX; 
    textClipShadow.y = textClip.y + offsetY; 

    var matrix:Matrix = new Matrix(); 
    matrix.createGradientBox(2*lightRadius,2*lightRadius,0,-lightRadius,-lightRadius); 
    frontLight = new Sprite(); 
    frontLight.graphics.beginGradientFill("radial",[illuminatedTextColor,ambientColor],[1,1],[16,255],matrix); 
    frontLight.graphics.drawEllipse(-lightRadius,-lightRadius,2*lightRadius,2*lightRadius); 
    frontLight.graphics.endFill(); 

    matrix = new Matrix(); 
    matrix.createGradientBox(2*scaleFactor*lightRadius,2*scaleFactor*lightRadius,0,-scaleFactor*lightRadius,-scaleFactor*lightRadius); 
    backLight = new Sprite(); 
    backLight.graphics.beginGradientFill("radial",[lightOnBackWallColor,0x000000],[1,1],[16,255],matrix); 
    backLight.graphics.drawEllipse(-scaleFactor*lightRadius,-scaleFactor*lightRadius,2*scaleFactor*lightRadius,2*scaleFactor*lightRadius); 
    backLight.graphics.endFill(); 

    frontLight.x = textCenterX; 
    frontLight.y = textCenterY+15; 
    backLight.x = frontLight.x + offsetX; 
    backLight.y = frontLight.y + offsetY; 

    this.addChild(backLight); 
    this.addChild(textClipShadow); 
    this.addChild(textClipAmbient); 
    this.addChild(frontLight); 
    this.addChild(textClip); 
    frontLight.mask = textClip; 

    this.addEventListener(Event.ENTER_FRAME, onEnter); 

} 

function onEnter(evt:Event):void { 
    counter++; //-- Increase the counter var 
    //-- When counter is 200, stop the enter frame event 
    if (counter > 200) this.removeEventListener(Event.ENTER_FRAME, onEnter); 
    frontLight.x = textCenterX - 0.3*sw*Math.cos(getTimer()*0.0006); 
    backLight.x = textCenterX - scaleFactor*(textCenterX-frontLight.x) + offsetX; 
} 

一个Timer将工作以及太

+0

谢谢,我明天会试试这个,因为我现在必须走了。详细说明,是的,所有代码都位于一个框架中,因为源文件的来源如此。但是,一旦我开始工作,我将添加其他图层并扩展时间轴。正如我所说我不知道​​有关AS3的任何事情,我只是认为会有一个简单的方法来定义在电影中应该运行多长时间 – user1130820 2013-04-30 17:01:03

+0

既然你是AS3的新手,我会建议你不要使用帧。帧是时间轴上的帧。我知道它令人困惑,尤其是一个名为'onEnterFrame'的事件。即使使用1个物理帧文件,该文件仍然具有可在属性面板中更改的帧频。 “ENTER_FRAME”事件的速度将基于该数字。除非你正在做实际的动画,否则我建议你坚持使用1帧电影并使用动作脚本来完成所有的工作 – Ronnie 2013-04-30 17:18:25

+0

是的,这是有效的,但我确实需要做多帧动画,并且我没有AS3那么多的方面,所以我可能只是一起废除AS3。我只是希望闪光是一个更友好的小菜,并有一些不错的效果。 – user1130820 2013-05-01 09:16:40

0

如果在帧50添加事件侦听器:

this.addEventListener(Event.ENTER_FRAME, onEnter);

然后你就可以去除帧100相同的监听器:

this.removeEventListener(Event.ENTER_FRAME, onEnter);

这样, onEnter功能只能通过帧50到100调用。

+0

这不会工作。 OP实际上没有使用任何帧。所有代码都位于一个框架中。 – Ronnie 2013-04-30 16:37:14