SpriteKit错误地检测到多个碰撞

时间:2014-09-29 20:36:51

标签: ios xcode sprite-kit collision-detection

我一直在阅读SpriteKit教程,该教程制作了Flappy Bird Style游戏。我遇到的一个问题是它错误地触发了碰撞检测代码。

有时候,它会变得完美......它撞击地面,它会触发与地面碰撞时的方法。然而,在看似随机的时间里,它会撞到地面,并在2-6倍的地方发射地面碰撞的方法。屏幕上是否存在任何其他节点并不重要。我可以坐下来让它立即掉落,有时候我会把碰撞代码正确地运行一次,其他时候会运行几次。这段代码是否有问题导致它这样做?

更新:似乎是两个物体在多个交叉点上相遇的地方。如果物体A在3点与物体B相交,则会发射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];
}

1 个答案:

答案 0 :(得分:1)

我解决这个问题最简单的方法就是使用它。

第一 创建一个名为running的BOOL。

BOOL running;

第二 游戏开始时设置为YES

running = YES;

第三 在碰撞代码周围放置一个if语句,如下所示,

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

您还可以使用此运行bool来控制各种其他有用的部分,例如更新方法。