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分钟。这太疯狂了,在编写任何代码之前先阅读一些教程。