SpriteKit中用于调度事件的`CACurrentMediaTime()`的替代方法是什么?

3

我相对而言比较新于SpriteKit,想知道除了使用CACurrentMediaTime()来安排事件之外还有哪些替代方法。例如,我可能会实现一个算法,通过将玩家上一次发射的时间加上一定的“冷却”时间,与当前媒体时间进行比较来防止玩家连续发射过多子弹:

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

我遇到的问题是,如果我决定改变节点或整个场景的速度,则这个逻辑就会崩溃。例如,如果我给玩家增加速度提升道具,我可以减慢除了玩家以外的所有其他节点的速度,但是敌人开火的时间会被搞乱。
还有哪些替代方案可以考虑CACurrentMediaTime(),并且可以考虑节点的速度
2个回答

1

关于定时发射,我能想到两个选项:

1)为你的玩家类创建一个实例变量/属性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
值得注意的是,这些不仅仅是替代方案,而且这些是在Sprite Kit中执行任何定时事件的唯一方法,其中一个原因是这些是唯一符合“暂停”属性的方法。 - CodeSmile
@sangony 不管节点的 speed 是多少,waitForDuration: 都会在两秒后执行,对吗? - Wayne Hartman
@WayneHartman - 你说得完全正确。不过从你的问题中,我认为你想让玩家的射击有一个冷却时间。但是我不确定你想要通过减慢特定节点的速度来实现什么。当然,你可以根据节点的速度将2秒的值更改为其他值。 - sangony

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接