Liam
Liam

Reputation: 65

How to get this code to show movieclip correctly?

I have the following code and it works fine, except I want it to play the Explosion movieclip in the library when an EnemyShip disappears but I only want it to play once and then disappear but not quite sure how to do it (I've tried a few things and it either makes the explosion animation loop and the ships don't disappear, which I believe is as a result of putting it inside the kill function, or I get other ArgumentErrors).

var speed:Number;
var shot = new ShotSound();
var explosion = new Explosion();

this.x = 800;
this.y = Math.random() * 275 + 75;
speed = Math.random()*5 + 9;
addEventListener("enterFrame", enterFrame);
addEventListener(MouseEvent.MOUSE_DOWN, mouseShoot);

function enterFrame(e:Event)
{
   this.x -= speed;
   if(this.x < -100)
{
   removeEventListener("enterFrame", enterFrame);
   stage.removeChild(this);
} 
}

function kill()
{
    stage.addChild(this);
    explosion.x = this.x;
    explosion.y = this.y;
    removeEventListener("enterFrame", enterFrame);
stage.removeChild(this);
    shot.play();
}

function mouseShoot(event:MouseEvent)
{
    kill();
}

Thank for for any help I may receive.

Upvotes: 0

Views: 149

Answers (2)

BadFeelingAboutThis
BadFeelingAboutThis

Reputation: 14406

You need some script to fire when the Explosion reaches it's final frame. A few ways you can do this:

1. Dispatch an event on the last frame of your explosion animation. eg. this.dispatchEvent(new Event(Event.COMPLETE)); then listen for that event:

var explosion = new Explosion();
addChild(explosion);
explosion.addEventListener(Event.COMPLETE, removeExplosion);

function removeExplosion(e:Event):void {
    MovieClip(e.currentTarget).stop();
    MovieClip(e.currentTarget).removeEventListener(Event.COMPLETE, removeExplosion);
    removeChild(MovieClip(e.currentTarget));
}

2. Have the explosion remove itself on the last frame of the animation. eg. if(this.parent) parent.removeChild(this);

3. If you can't or don't want to modify the explosion timeline, use the undocumented AddFrameScript command:

var explosion = new Explosion();
addChild(explosion);
explosion.addFrameScript(explosion.totalFrames-1, function():void {
    explosion.stop();
    if(explosion.parent){
        explosion.parent.removeChild(explosion);
    }
});

Here is a tip with your setup:

add a function called removeMe (or similiar) to avoid redundant code (so you call this function on kill or when the ship goes out of bounds

function removeMe(e:Event = null):void {
    this.removeEventLIstener(Event.ENTER_FRAME,enterFrame);
    if(this.parent){
        this.parent.removeChild(this);
    }
    //any other cleanup that's required
}

Next, an updated kill function:

function kill(){
    var explosion = new Explosion();
    explosion.addEventListener(Event.COMPLETE, removeMe); //you need to dispatch this event on the last frame of the explosion timeline as shown below
    addChild(explosion); //add it to the ship so it stays with it as the ship moves

    //not sure what shot.play() does and if that belongs here.
}

//on the last frame of your explosion timeline:
stop();
dispatchEvent(new Event(Event.COMPLETE));

Upvotes: 2

Marcela
Marcela

Reputation: 3738

For starters, you're never adding explosion to the display list.

Change

var explosion = new Explosion();
stage.addChild(this);

to

var explosion = new Explosion();
stage.addChild(explosion);

Once you've done that, you'll want to add a listener to explosion to find out when it has finished playing:

explosion.addEventListener(Event.ENTER_FRAME, onExplosionProgress);

function onExplosionProgress(e:Event):void 
{
    if(explosion.currentFrame == explosion.totalFrames)
    {
        // explosion has reached end of its timeline
        explosion.removeEventListener(Event.ENTER_FRAME, onExplosionProgress);
        explosion.stop();
        stage.removeChild(explosion);
    }
}

Upvotes: 0

Related Questions