我遇到一个问题,我的Sprite Kit游戏只有在主角和任何其他精灵之间发生第一次碰撞时才会滞后。发生第一次碰撞后,每隔一次碰撞都是平滑的,并以60.0 fps的速度运行。奇怪的是,当第一次碰撞时,fps只下降到49-51,但实际游戏冻结半秒。这也不是设置延迟的问题,因为无论我等待多久都会发生这种情况。有谁知道这是什么问题?
-(void)checkForCollisions {
if (_invincible) return;
[self enumerateChildNodesWithName:@"enemy"
usingBlock:^(SKNode *node, BOOL *stop){
SKSpriteNode *enemy = (SKSpriteNode *)node;
CGRect smallerFrame = CGRectInset(enemy.frame, 22, 22);
if (CGRectIntersectsRect(smallerFrame, _sloth.frame)) {
[enemy removeFromParent];
[self runAction:[SKAction playSoundFileNamed:@"eagle.wav" waitForCompletion:NO]];
NSString *burstPath =
[[NSBundle mainBundle] pathForResource:@"ExplosionParticle" ofType:@"sks"];
SKEmitterNode *burstEmitter =
[NSKeyedUnarchiver unarchiveObjectWithFile:burstPath];
burstEmitter.position = _sloth.position;
[self addChild:burstEmitter];
[self changeInLives:-1];
_invincible = YES;
float blinkTimes = 10;
float blinkDuration = 3.0;
SKAction *blinkAction =
[SKAction customActionWithDuration:blinkDuration
actionBlock:
^(SKNode *node, CGFloat elapsedTime) {
float slice = blinkDuration / blinkTimes;
float remainder = fmodf(elapsedTime, slice);
node.hidden = remainder > slice / 2;
}];
SKAction *sequence = [SKAction sequence:@[blinkAction, [SKAction runBlock:^{
_sloth.hidden = NO;
_invincible = NO;
}]]];
[_sloth runAction:sequence];
}
}];
}
滞后没有与发射器节点相关联,因为游戏在被注释时仍然滞后。 如果您需要任何其他信息,请与我们联系。提前致谢! 以下是我的Instruments跟踪文件的链接:https://www.dropbox.com/sh/xvd1xdti37d76au/ySL4UaHuOS 如果查看跟踪文件,请注意当Time Profiler达到118%时发生冲突。
答案 0 :(得分:1)
正如Cocos所提到的,可能是声音文件的初始加载导致了一次延迟。
在您的实现中添加声音操作:
SKAction *eagleSound;
在你的init方法中添加:
eagleSound = [SKAction playSoundFileNamed:@"eagle.wav" waitForCompletion:NO];
然后,无论何时需要播放声音,请使用:
[self runAction:eagleSound];