【问题标题】:Expected ')' before ';' token error?';' 之前应为 ')'令牌错误?
【发布时间】:2011-03-25 14:29:09
【问题描述】:

我正在创建一个 Iphone 应用程序,它由一个每 60 秒调用一次 -(void)gameLoop 的 NSTimer 工作。这是游戏循环

-(void)gameLoop {

 paratrooperTimer += 1;

if (gameState == KGameStateBegin) {
    BtnStart.hidden = 0;
    BtnResume.hidden = 1;
    BtnPause.hidden = 1;
} 
else if (gameState == KGameStateRunning) {

    BtnStart.hidden = 1;
    BtnPause.hidden = 0;

    [self playGameLoop];
}
else if (gameState == KGameStatePaused) {

    BtnResume.hidden = 0;
    BtnPause.hidden = 1;
}
else if (gameState == KGameStateGameOver) {

    [self endGame];
}
else if (paratrooperTimer == 120) {

    (paratrooperTimer = 0);
    [self spawnParatrooper];

}



}

我在 ';' 之前收到错误“Expected ')'标记”在每个 if 语句和 ParatrooperTimer+=1 行中。

GameState 是整数,所有的 KGameState 也是如此...。 请帮我! 非常感谢

【问题讨论】:

  • 您在此处提交的代码有不平衡的大括号。这是因为您的代码不平衡还是因为部分复制和粘贴,我们无法判断。可以肯定的是,您在这里输入的是语法错误。

标签: iphone token


【解决方案1】:

这不是你的问题,但你已经为我提出了我以前遇到过的危险信号,你可能会感谢一些提前警告。

NSTimer 在事件循环结束时触发。它不是节拍器——当它被调用时它会被调用,它可能根本不是正常的。阻止应用程序的长进程将阻止 NSTimer 准时触发。 NSTimer 的最大分辨率为 50-100 毫秒(根据文档)。因此,在最好的情况下,它每秒会触发 20 次,而您试图要求它提供比这更精细三倍的分辨率。

对于分辨率较低的东西,NSTimer 非常棒,但要尽可能快地脉冲,它可能根本不起作用。但是,你真的需要 60 帧/秒吗?

【讨论】:

    【解决方案2】:

    您可能在 - (void)gameLoop 上方的某处有一个不平衡的括号,或者您在 .h 文件中遗漏了方法声明 - (void)gameLoop; 中的分号(但我认为这会给您一个不同的错误消息)。

    【讨论】:

      【解决方案3】:

      您必须将 (NSTimer *) aTimer 添加到您的函数签名中,如下所示:

      -(void)gameLoop :(NSTimer *) aTimer
      

      [NSTimer scheduleWithTimeInterval...的选择器中你应该添加一个分号:

      @selector(gameLoop:)
      

      至于你的功能:

      你最后一个 if 语句中的这一行是关于什么的,为什么你需要括号?

      (paratrooperTimer = 0);
      

      这可能是编译错误的原因

      【讨论】:

        【解决方案4】:

        我怀疑是括号错字或无效的计时器签名。

        定时器示例:

        self.timer = [NSTimer scheduledTimerWithTimeInterval:60.0   
                                                      target:self   
                                                    selector:@selector(timerHandler:) 
                                                    userInfo:nil
                                                     repeats:YES];
        

        其中timerHandler定义为:

        - (void)updateTimeView:(id)inTimer;  
        

        无论如何,你为什么不用switch-case 声明呢?大量的if 可以帮助保持代码的可读性,因此可以更轻松、更快地找到括号拼写错误。 Switch-case explanation

        【讨论】:

          猜你喜欢
          • 2015-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多