我一直在学习制作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];
}

最佳答案

我要解决此问题的最简单方法是使用此方法。

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

BOOL running;

第二名
游戏开始时将运行设置为“是”
running = YES;

第三名
像这样在您的冲突代码周围放置一个if语句,
if(running == YES)
{
   //do collision detection
}
else
{
   //do nothing
}

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

关于ios - SpriteKit错误地检测到多个碰撞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26108429/

10-14 21:03