未检测到 SkSpriteNode 冲突

Posted

技术标签:

【中文标题】未检测到 SkSpriteNode 冲突【英文标题】:SkSpriteNode collision not being detected 【发布时间】:2014-11-15 11:09:01 【问题描述】:

我正在使用 Sprite Kit 来检测两个对象之间的碰撞。下面是我如何定义它们的位掩码。

static const uint32_t puffinCategory = 0x1 << 0;
static const uint32_t planeCategory = 0x1 << 1;

这是我关于如何设置海雀和飞机物理体的代码。 海雀用

SKSpriteNode *PuffinNode = [[SKSpriteNode alloc]initWithImageNamed:@"puffin"];
    PuffinNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:PuffinNode.size];
    PuffinNode.physicsBody.usesPreciseCollisionDetection = YES;
    PuffinNode.physicsBody.categoryBitMask = puffinCategory;
    PuffinNode.physicsBody.dynamic = NO;
    PuffinNode.physicsBody.collisionBitMask = puffinCategory;
    PuffinNode.physicsBody.contactTestBitMask = planeCategory;


    [PuffinNode setZPosition:1.5];

飞机

SKSpriteNode *planeSpriteNode = [[SKSpriteNode alloc]initWithImageNamed:planeStringFileName];
planeSpriteNode.position = CGPointMake(0, self.view.frame.size.height*-1);
planeSpriteNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:planeSpriteNode.size];
planeSpriteNode.physicsBody.usesPreciseCollisionDetection = YES;
planeSpriteNode.physicsBody.categoryBitMask = planeCategory;
planeSpriteNode.physicsBody.dynamic = NO;
planeSpriteNode.physicsBody.collisionBitMask = puffinCategory;
planeSpriteNode.physicsBody.contactTestBitMask = puffinCategory;

这是我对委托方法 didBeginContact 的实现:

-(void)didBeginContact:(SKPhysicsContact *)contact
    NSLog(@"collission method run");
    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 & puffinCategory) != 0 && (secondBody.categoryBitMask & planeCategory) != 0 )
        NSLog(@"collission occured");
       

如果调用方法,我看不到日志记录,当两个精灵碰撞时我也看不到日志。

【问题讨论】:

你不是忘了设置SKScenephysicsWorld.contactDelegate吗? 这是在 didMoveToView 方法中完成的。 【参考方案1】:

你设置

PuffinNode.physicsBody.dynamic = NO;

planeSpriteNode.physicsBody.dynamic = NO;

两个静态的物体不能碰撞,至少一个应该是动态的

【讨论】:

【参考方案2】:

一些问题:

1) 您是否设置了 SKScene 的 physicsWorld.contactDelegate ? 2)你的两个节点都没有动态。如果你想让它们在物理世界中交互,你应该让它们符合物理定律。其中之一至少必须是动态的。 3) 你的collisionBitMask 设置不好。

【讨论】:

以上是关于未检测到 SkSpriteNode 冲突的主要内容,如果未能解决你的问题,请参考以下文章

如何检测精灵节点上特定位置的 SKSpriteNode 之间的冲突?

NSight Compute - 预期银行冲突但未检测到任何

在子类节点中未检测到冲突

如何使用已创建的 SKSpriteNode 创建与 SpriteKit 的冲突?

未检测到 SKSpriteNode 触摸

didBegin 未检测到两个 SKSpriteNode 之间的接触