替代`CACurrentMediaTime()`用于在SpriteKit中调度事件

时间:2014-05-28 00:58:54

标签: ios core-animation sprite-kit

我对SpriteKit比较陌生,我想知道使用CACurrentMediaTime()来调度事件有哪些替代方法。例如,我可以实现一种算法,通过添加最后一次用“冷却”时段解雇的玩家,将玩家与当前媒体时间进行比较,从而阻止玩家多次发射:

BOOL canFire = self.lastFireInterval + self.coolPeriod < CACurrentMediaTime();

我遇到的问题是,如果我决定改变节点的speed,甚至是整个场景,那么这个逻辑就会崩溃。例如,如果我给玩家加速加速,我可以减速除了玩家之外的所有其他节点,但是对于被射击的敌人来说时间间隔会混乱。

CACurrentMediaTime()还有哪些其他替代因素会影响节点的speed

2 个答案:

答案 0 :(得分:1)

关于射击的时间,我想到了两个选项:

1)为您的玩家类创建一个ivar / property BOOL readyNextMove;。然后,当您的播放器拍摄时,将readyNextMove设置为false并添加此代码:

SKAction *wait = [SKAction waitForDuration:2.0];
SKAction *block0 = [SKAction runBlock:^{
        readyNextMove = true;
}];
[self runAction:[SKAction sequence:@[wait, block0]]];

2)您可以使用update:(CFTimeInterval)currentTime方法查看经过多少时间,例如玩家射击,并相应地设置readyNextMove

答案 1 :(得分:0)

这是一个品味问题。但对于所有游戏,我保留了一个基于内部帧的时钟来处理所有事情。我坚信这是最好的方法,但当然这取决于你的项目范围。这种方法非常严格,可以保证连续性。如果你使用计时器和你的游戏滞后,你的连续性就会被抛弃(在某些情况下,射手可能会比你游戏的其他部分每帧射击次数更多)。

在aScene.h中

long _currentTime = 0;

在aScene.m

-(void) update {
   _currentTime++;
   for(shooter * aShooter in self.shooters) {
      [aShooter updateWithTime:_currentTime];
   }
}

在你的shooter.m

-(BOOL) tryShoot:(long)globalTime {
   if(_lastShootingTime<globalTime-shootingCooldown) {
      _lastShootingTime = globalTime;
      [self fireBullet];
      return YES;
   }
   return NO;
}


-(void) updateWithTime:(long)globalTime {
   //...perform shooters action for that time frame
   _lastUpdatedTime = globalTime;
}