删除计时器事件侦听器

时间:2014-08-19 17:54:32

标签: actionscript-3

所以我需要删除一个计时器事件。但问题是,它在另一个功能中,所以我无法访问它。

以下是我的代码的用法:

- 有一个老板

- 它会生成炸弹

-Bomb在爆炸前持续几秒钟(无错误)

- 可以通过单击删除炸弹。 (生成错误)

如果通过点击删除炸弹,则会出现错误,因为时间事件未被删除。但就像我说的那样,我无法删除它,因为它在另一个功能中。救命啊!

import flash.events.Event;
import flash.display.MovieClip;

var boss:MovieClip = new darklord();
this.addChild(boss);
boss.x = stage.stageWidth / 2;
boss.y = stage.stageHeight / 2;

var lives:int = 3;
var maxHP:int = 2000;
var currentHP:int = maxHP;
var percentHP:Number = currentHP / maxHP;

var bombcontainer:Array = [];
var timecontainer:Array = [];

function updateHealthBar():void
{
    percentHP = currentHP / maxHP;
    healthBar.barColor.scaleX = percentHP;
}

boss.addEventListener(MouseEvent.CLICK, TapBoss);
boss.addEventListener(Event.ENTER_FRAME, MoveBoss);

function TapBoss(e:MouseEvent):void
{
    currentHP -=  10;
    if (currentHP <= 0)
    {
        currentHP = 0;
        trace("You win!");
    }
    updateHealthBar();
}

var timerBoss:Timer = new Timer(1000,60);
timerBoss.addEventListener(TimerEvent.TIMER, bosstimerhandler);
timerBoss.start();

var secondsBoss:Number = 0;

function bosstimerhandler(event:TimerEvent)
{
//trace("Seconds elapsed: " + seconds);
//SpawnNote(null);
    if (secondsBoss%5==0)
    {
        RandomCoord(null);
        BossAttack(null);
    }
    secondsBoss++;
}

var HighH:int = stage.stageHeight;
var HighW:int = stage.stageWidth;
var LowH:int = 0;
var LowW:int = 0;

var destinationX:int;
var destinationY:int;

function RandomCoord(event:Event):void
{
    destinationX=Math.floor(Math.random()*(1+HighW-LowW))+LowW;
    destinationY=Math.floor(Math.random()*(1+HighH-LowH))+LowH;

    if (destinationX <= 50)
    {
        destinationX +=  50;
    }

    if (destinationY <= 50)
{
    destinationY +=  50;
}

if (destinationX + 50 >= stage.stageWidth)
{
    destinationX -=  50;
}

if (destinationY + 50 >= stage.stageHeight)
{
    destinationY -=  50;
}

    trace("X is: ", destinationX);
    trace("Y is: ", destinationY);
}

function MoveBoss(event:Event):void
{
    if (boss.x < destinationX)
{
    boss.x +=  1;
}
else if (boss.x > destinationX)
{
    boss.x -=  1;
}

if (boss.y < destinationY)
{
    boss.y +=  1;
}
else if (boss.y > destinationY)
{
    boss.y -=  1;
}
}

function BossAttack(event:Event):void
{
    var boom:MovieClip = new Bomb();
    this.addChild(boom);
    bombcontainer.push(boom);
    boom.x = boss.x;
    boom.y = boss.y;
    BombCoord(null);
    boom.addEventListener(Event.ENTER_FRAME, MoveBomb);
    boom.addEventListener(MouseEvent.CLICK, TapBomb(boom));
    BombTimer(boom);
}

function BombTimer(boom:MovieClip):void
{       
var time:Timer = new Timer(1000,30);    
timecontainer.push(time);
time.addEventListener(TimerEvent.TIMER, TimeHandler);
time.start();

var t:Number = 1;

function TimeHandler(event:TimerEvent):void
{

    trace("Seconds elapsed: " + t);
    t++;
    if (t==12)
    {
        lives--;
        trace("You lost a life!");
        time.removeEventListener(TimerEvent.TIMER, TimeHandler);
        RemoveBomb(boom, 0);
    }
    }
}

function RemoveBomb(boom:DisplayObject, bid:int):void
{
boom.removeEventListener(Event.ENTER_FRAME, MoveBomb);  
//boom.removeEventListener(MouseEvent.CLICK, TapBomb(boom)); 
bombcontainer.splice(bid, 1);
trace("Bomb # :" +bid+" is popped.");
this.removeChild(boom);
}

var BombX:int;
var BombY:int;

function BombCoord(event:Event):void
{
BombX=Math.floor(Math.random()*(1+HighW-LowW))+LowW;
BombY=Math.floor(Math.random()*(1+HighH-LowH))+LowH;

if (BombX <= 50)
{
    BombX +=  50;
}

if (BombY <= 50)
{
    BombY +=  50;
}

if (BombX + 50 >= stage.stageWidth)
{
    BombX -=  50;
}

if (BombY + 50 >= stage.stageHeight)
{
    BombY -=  50;
}
}

function MoveBomb(event:Event):void
{
var boom:DisplayObject = event.target as DisplayObject;

var fl_TimerInstance:Timer = new Timer(1000,6);
fl_TimerInstance.addEventListener(TimerEvent.TIMER, fl_TimerHandler);
fl_TimerInstance.start();

var fl_SecondsElapsed:Number = 1;

function fl_TimerHandler(event:TimerEvent):void
{
    //trace("Seconds elapsed: " + fl_SecondsElapsed);
    fl_SecondsElapsed++;
    if (fl_SecondsElapsed==4)
    {
        boom.removeEventListener(Event.ENTER_FRAME, MoveBomb);
    }
}

if (boom.x < BombX)
{
    boom.x +=  5;
    //boom.x +=5;
}
else if (boom.x > BombX)
{
    boom.x -=  5;
}//boom.x -=5;

if (boom.y < BombY)
{
    boom.y +=  5;
    //boom.x +=5;
}
else if (boom.y > BombY)
{
    boom.y -=  5;
}

if (boom.x == BombX)
{
    if (boom.y == BombY)
    {
        boom.removeEventListener(Event.ENTER_FRAME, MoveBomb);
    }
}

if (boom.y == BombY)
{
    if (boom.x == BombX)
    {
        boom.removeEventListener(Event.ENTER_FRAME, MoveBomb);
    }
}
}

function TapBomb(boom:MovieClip):Function
{
return function(e:MouseEvent):void {    
var BombIndex:int = bombcontainer.indexOf(boom);
trace("You clicked the bomb at index " + BombIndex);    
RemoveBomb(boom, BombIndex);    
}
}         

1 个答案:

答案 0 :(得分:0)

每个炸弹上都有一个帧事件监听器并不是那么糟糕,除非你可能同时拥有数百枚炸弹。

您可以通过将Bomb设置为具有自己的处理程序和计时器的单独类来解决此问题。这样的事情(未经测试):

package {
import flash.display.*;
import flash.net.*;
import flash.utils.Timer;

public class Bomb extends MovieClip {

    private var myTimer:Timer;

    public function Bomb() {
        myTimer = new Timer(1000,30);
        myTimer.addEventListener(TimerEvent.TIMER, TimeHandler);
        myTimer.start();
    }

    private function TimeHandler(event:TimerEvent):void {
        // check the time
    }

    public function stopTicking():void {
        this.myTimer.stop();
    }
}
}

然后你可以通过调用他们的方法创建你想要的所有炸弹并杀死他们的计时器:

// create a bomb movieclip and add it to the displaylist
var myBomb = new Bomb();
bombContainer.addChild(myBomb);

// use the displaylist to keep track of nonexploded bombs
var someBomb = bombContainer.getChildAt(0);
// stop the timer on this bomb
someBomb.stopTicking();