【问题标题】:Actionscript 3 timer is unidentified, how do I fix this?Actionscript 3 计时器无法识别,我该如何解决?
【发布时间】:2023-03-09 05:03:01
【问题描述】:

我正在构建一个记忆 Flash 游戏,其中有一个计时器,可以让您有一定的时间来完成一副纸牌。这个定时器的代码如下所示:

public function memory():void
{
      levelDuration = 10;
      gameTime = levelDuration;
      var gameTimer:Timer = new Timer(1000,levelDuration);
      gameTimer.addEventListener(TimerEvent.TIMER, updateTime);
      gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timeExpired);
      gameTimer.start();
}

function updateTime(e:TimerEvent):void // what happens when the time runs out
    {
        // your class variable tracking each second, 
        gameTime--;
        //update your user interface as needed
        timeText.text = "Tijd : " + String(gameTime); //gameTime is defined before the public function memory

    }

function timeExpired(e:TimerEvent):void
    {
        var gameTimer:Timer = e.target as Timer;
        gameTimer.removeEventListener(TimerEvent.TIMER, updateTime);
        gameTimer.removeEventListener(TimerEvent.TIMER, timeExpired);
        finalScore = score;
        musicchannel.stop();
        gameTimer.stop();

        MovieClip(root).gotoAndStop("gameover");
    }

现在,这工作正常。计时器倒计时,当它到期时,它会将您带到游戏结束屏幕。但是,当您在时间到期之前完成游戏时,计时器不会停止。当它决定它已经用完时,它会带你回到游戏结束屏幕,即使你已经开始了一个新游戏。

我尝试通过将 gameTimer.stop() 放入其他将您带到游戏结束屏幕的函数来解决此问题,但随后出现了另一个问题。尝试在其他功能中停止计时器时发生这种情况,例如这个(播放时停止按钮):

function stopplaying(event:MouseEvent){
    gameTimer.stop();
    finalScore = score;
    musicchannel.stop();
    MovieClip(root).gotoAndStop("introduction");
}

这会给我一个编译错误 1120:访问未定义的属性 gameTimer。 我知道如果该函数侦听 TimerEvent,则 gameTimer 通常只能在函数内受到影响,但我看不到以任何其他方式执行此操作的任何选项。

我尝试将 gameTimer 设为公共变量,但它不允许我在主内存函数中执行此操作。 此外,当我尝试将其定义为函数之外的公共变量时,但在类中,计时器仍会倒计时。但是当它到期时,它只是给出一个随机的高数字作为回报,并且不会进入游戏结束屏幕。

我希望对我的问题的解释不是太含糊,并且您能够帮助我解决这个问题。这是一个学校项目,很快就要到期了!另外,我不能仅靠互联网自己解决这个问题:(几次尝试只会让事情变得更糟,现在我已经走到了这一步,我害怕把事情搞砸。

【问题讨论】:

    标签: actionscript-3 flash timer


    【解决方案1】:

    您将其声明为公共变量可能是正确的。但是您在哪里声明它?

    在 AS(所有版本)中,您有 功能范围。这意味着如果您在函数内声明变量,则该变量仅在该函数内“存在”(可访问)。检查你在哪里声明你的变量:

    public function memory():void
    {
          levelDuration = 10;
          gameTime = levelDuration;
          var gameTimer:Timer = new Timer(1000,levelDuration); // <-
          gameTimer.addEventListener(TimerEvent.TIMER, updateTime);
          gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timeExpired);
          gameTimer.start();
    }
    

    这意味着您的变量“gameTimer”是函数 memory() 的本地变量。您将无法在此函数之外的任何地方使用您的变量,因为它仅存在于 memory() 内部。为了解决这个问题,你把它移到了函数之外:

    private var gameTimer:Timer;
    
    public function memory():void
    {
          levelDuration = 10;
          gameTime = levelDuration;
          gameTimer = new Timer(1000,levelDuration);
          gameTimer.addEventListener(TimerEvent.TIMER, updateTime);
          gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timeExpired);
          gameTimer.start();
    }
    

    这将解决你所有的问题。

    【讨论】:

    • 是的!这解决了它!现在,只要我愿意,计时器就会停止。非常感谢:)
    猜你喜欢
    • 2020-11-25
    • 2019-05-10
    • 2016-11-16
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多