简体   繁体   中英

Flash - Stop AS3 after set amount of frames

This may be a stupid question as i am new to flash pro and don't know too much. So i have a frame with some action script (AS3) and this script runs constantly once started. What i want is a way to stop the script and continue playing the movie. So for example the script only runs between frames 50-100. How is this possible?

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;
}

If you are adding the event listener on frame 50:

this.addEventListener(Event.ENTER_FRAME, onEnter);

Then you can remove the same listener on frame 100:

this.removeEventListener(Event.ENTER_FRAME, onEnter);

This way the onEnter function will only be called through frames 50 to 100.

Since the project isn't actually using frames, you can setup a counter and basically increase the count as the enter frame event gets called. Try the below solution. Change 200 to whatever number you want. You can trace(counter) too if you like

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;
}

A Timer would work as well too

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM