2014-09-20 2 views
3

Я уже некоторое время работаю над игрой SpriteKit, и у меня есть досадная проблема, от которой я не могу избавиться. Я не хочу рассказывать слишком много об игре, но это очень просто. Я генерирую несколько объектов (SKSpriteNodes) каждую секунду, которые падают с верхней части экрана, используя физику SpriteKits, и игрок взаимодействует с ними.Опыт игры в игре SpriteKit

Часто игра проходит отлично (постоянная 60 FPS). Проблема в том, что иногда (возможно, раз в минуту или что-то в этом роде) игра начинает немного отставать примерно на 3-5 секунд (все еще на 60 FPS), а затем она отлично работает (примечание: я запускаю игра на iPhone 5s). Кажется, это из-за физики, потому что, если я добавлю нормальное действие перемещения на объект, он работает очень плавно, в то время как узлы, затронутые физикой, отстают.

Я попытался удалить некоторые частицы и эффекты, которые у меня есть, и я повторно использую свои объекты, но я не могу удалить отставание. Я решил создать очень простой тестовый проект, чтобы увидеть, будет ли отставание, но оно все еще там. Вот код:

#import "GameScene.h" 

static const uint32_t groundCategory = 1 << 0; 
static const uint32_t objectCategory = 1 << 1; 

@implementation GameScene 

-(void)didMoveToView:(SKView *)view 
{ 
    // Init 
    self.backgroundColor = [UIColor blackColor]; 
    self.physicsWorld.gravity = CGVectorMake(0.0f, -3.2f); 
    self.physicsWorld.contactDelegate = self; 

    // Ground 
    SKPhysicsBody* ground = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointMake(0, -88) toPoint:CGPointMake(self.size.width, -88)]; 
    ground.categoryBitMask = groundCategory; 
    self.physicsBody = ground; 

    // Start game loop 
    SKAction* waitAction = [SKAction waitForDuration:1]; 
    SKAction* sequence = [SKAction sequence:@[[SKAction performSelector:@selector(addObject) onTarget:self], waitAction]]; 
    SKAction* repeatAction = [SKAction repeatActionForever:sequence]; 
    [self runAction:repeatAction withKey:@"fallingObjectsAction"]; 
} 

- (void)addObject 
{ 
    SKSpriteNode* newObject = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(88, 88)]; 
    newObject.name = @"Object"; 
    newObject.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:newObject.size]; 
    newObject.position = CGPointMake(CGRectGetMidX(self.frame), self.frame.size.height + newObject.size.height); 
    newObject.physicsBody.categoryBitMask = objectCategory; 
    newObject.physicsBody.contactTestBitMask = groundCategory; 
    newObject.physicsBody.collisionBitMask = 0; 

    [self addChild:newObject]; 
} 

- (void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    if ([contact.bodyA.node.name isEqualToString:@"Object"]) 
     [contact.bodyA.node removeFromParent]; 
    else if ([contact.bodyB.node.name isEqualToString:@"Object"]) 
     [contact.bodyB.node removeFromParent]; 
} 

@end 

Я генерирую один объект каждую секунду и позволяю ему падать с верхней части экрана. Когда он попадает на землю, он удаляется.

Я использую физику неправильно или это ошибка SpriteKit, что она отстает? Кажется странным, потому что у меня работает очень простой проект с использованием iPhone 5 с iOS 8.

+0

Как вы определили, что игра все еще работает со скоростью 60 кадров в секунду, когда она отстает? Вы использовали drawsFPS и другие флаги? Что такое использование ЦП (см. Вкладку XQode Debug Navigator), когда она отстает, а когда нет? – LearnCocos2D

+0

В viewController я установил skView.showsFPS = YES; Использование ЦП (для тестового проекта, на котором я разместил код) 11%, когда он не отстает, и 11%, когда он отстает, поэтому никакой разницы нет. – simon91

+0

звучит как лаг, это что-то еще, например, если вы попытаетесь переместить узлы с поддержкой физики с помощью действий перемещения, это будет противоречить физике. – LearnCocos2D

ответ

2

Хорошо, у меня такая же проблема с физикой. Проблема заключалась в том, что объекты были неустойчивыми, несмотря на низкое использование ЦП и последовательный FPS. Я, наконец, понял, почему. Решение, которое я нашел, не задает значение physicalWorld.speed 1.0; установите его на .9999. Теперь все работает гладко.

Надеюсь, это поможет.

+0

У меня была дрожь в моей игре, даже когда отладчик читал 60 кадров в секунду, и это решило мою проблему. Интересно, является ли это ошибкой со стороны Apple? В любом случае, вы спасли мне массу неприятностей. –

+0

странно, кажется, как ошибка Apple, мне интересно, что там происходит –