Actionscript 3 删除计时器事件侦听器

Actionscript 3 删除计时器事件侦听器,actionscript-3,Actionscript 3,所以我需要删除一个计时器事件。但问题是,它在另一个函数中,所以我无法访问它 我的代码是这样的: -有一个老板 -它能制造炸弹 -炸弹在爆炸前会持续几秒钟没有错误 -炸弹可以通过点击移除。产生错误 如果通过单击移除炸弹,则会出现错误,因为时间事件未移除。但是就像我说的,我不能删除它,因为它在另一个函数中。救命啊 import flash.events.Event; import flash.display.MovieClip; var boss:MovieClip = new darklord(

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

我的代码是这样的:

-有一个老板

-它能制造炸弹

-炸弹在爆炸前会持续几秒钟没有错误

-炸弹可以通过点击移除。产生错误

如果通过单击移除炸弹,则会出现错误,因为时间事件未移除。但是就像我说的,我不能删除它,因为它在另一个函数中。救命啊

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

在每个炸弹上都有一个帧事件监听器并不坏,除非你可能同时有数百个炸弹

您可以通过使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();

无论如何,这是一个糟糕的编码。您不能将enterframe侦听器添加到每一个对象(如炸弹),这太耗费CPU了。您需要一个enterframe侦听器并更新其中的所有内容。但这是我知道的唯一方法:在为每个炸弹创建的enterframe中,在每个帧上创建一个新计时器!你的应用程序不可能运行5分钟。这太疯狂了,在编写任何代码之前先阅读一些教程。