2014-09-29 3 views
1

Я проходил учебное пособие по SpriteKit, которое делает игру Flappy Bird Style. Одна из проблем, с которой я сталкиваюсь, заключается в том, что он неправильно отключает код для обнаружения конфликтов.SpriteKit Неправильное обнаружение множественных столкновений

Иногда это идеальное решение ... оно ударяет по земле, оно запускает метод, когда он сталкивается с землей. Однако, в казалось бы случайные времена, он ударит по земле и сгорит метод наземных столкновений в любом месте от 2-6 раз. Не имеет значения, присутствуют ли какие-либо другие узлы на экране или нет. Я могу сидеть и позволять ему сразу бросаться, а иногда я получаю код коллизии правильно, один раз, а иногда он работает несколько раз. Что-то не так в этом коде, заставляя его это делать?

ОБНОВЛЕНИЕ: Кажется, что два объекта встречаются на нескольких пересекающихся точках. Если объект A пересекается с объектом B в 3 точках, он срабатывает 3 раза. Как вы держите его от этого?

- (void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    SKPhysicsBody *firstBody, *secondBody; 

    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
    { 
     firstBody = contact.bodyA; 
     secondBody = contact.bodyB; 
    } 
    else 
    { 
     firstBody = contact.bodyB; 
     secondBody = contact.bodyA; 
    } 

    if ((firstBody.categoryBitMask & pillerCategory) != 0 && 
     (secondBody.categoryBitMask & flappyBirdCategory) != 0) 
    { 
     [self pillar:(SKSpriteNode *) firstBody.node didCollideWithBird:(SKSpriteNode *) secondBody.node]; 
    } 
    else if ((firstBody.categoryBitMask & flappyBirdCategory) != 0 && 
      (secondBody.categoryBitMask & bottomBackgroundCategory) != 0) 
    { 
     [self flappyBird:(SKSpriteNode *)firstBody.node didCollideWithBottomScoller:(SKSpriteNode *)secondBody.node]; 
    } 
} 
- (void)pillar:(SKSpriteNode *)pillar didCollideWithBird:(SKSpriteNode *)bird 
{ 
    NSLog(@"Did collide with bird"); 
    [self showGameOverLayer]; 
} 

- (void)flappyBird:(SKSpriteNode *)bird didCollideWithBottomScoller:(SKSpriteNode *)bottomBackground 
{ 
    NSLog(@"Did collide with scroller"); 

    [self showGameOverLayer]; 
} 
+0

Вы установили биты столкновения, чтобы объекты не сталкивались? Возможно, ваш спрайт подпрыгивает на земле. – 0x141E

+0

Похоже, где нижние петли скроллеров, если узел падает туда, попадает на исходное изображение, а также на другое изображение, вызывая два столкновения. – user717452

ответ

1

Самый простой способ решить эту проблему - использовать это.

1-й Создать BOOL под управлением.

BOOL running; 

второй Комплект работает на YES, когда игра началась

running = YES; 

3rd Place, если заявление вокруг вашего кода столкновения, как это так,

if(running == YES) 
{ 
    //do collision detection 
} 
else 
{ 
    //do nothing 
} 

Вы также можете использовать этот ход bool для управления различными другими полезными частями, такими как ваш метод обновления.