我对SpriteKit比较陌生,我想知道使用CACurrentMediaTime()
来调度事件有哪些替代方法。例如,我可以实现一种算法,通过添加最后一次用“冷却”时段解雇的玩家,将玩家与当前媒体时间进行比较,从而阻止玩家多次发射:
BOOL canFire = self.lastFireInterval + self.coolPeriod < CACurrentMediaTime();
我遇到的问题是,如果我决定改变节点的speed
,甚至是整个场景,那么这个逻辑就会崩溃。例如,如果我给玩家加速加速,我可以减速除了玩家之外的所有其他节点,但是对于被射击的敌人来说时间间隔会混乱。
CACurrentMediaTime()
还有哪些其他替代因素会影响节点的speed
?
答案 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;
}