【问题标题】:Collision detection between two SKSpriteNode in SpriteKit?SpriteKit中两个SKSpriteNode之间的碰撞检测?
【发布时间】:2023-03-05 06:39:01
【问题描述】:

我必须检测两个 SKSpriteNode(wall, ma​​n) 之间的碰撞,这是一个SKNode 背景background 节点是主 SKScene gameScene 类的子节点。当我想使用该方法检测碰撞时

- (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;
    }
    NSLog(@"contact happened");
}

但是没有发现碰撞检测。请帮忙。

【问题讨论】:

    标签: ios7 xcode5 sprite-kit collision-detection


    【解决方案1】:

    您可能遇到以下两个问题之一:

    1. 您没有设置SKPhysicsWorld 对象的contactDelegate 属性。

    2. 您没有正确设置类别和联系测试位。

    以下是如何设置类别和联系测试位:

    #define kCategoryOne (1 << 0)
    #define kCategoryTwo (1 << 1)
    
    bodyA.categoryBitMask = kCategoryOne;
    bodyA.contactTestBitMask = kCategoryTwo;
    
    bodyB.categoryBitMask = kCategoryTwo;
    bodyB.contactTestBitMask = kCategoryOne;
    

    【讨论】:

    • 感谢您的回复。 SKPhysicsContactDelegate 是不兼容的背景类型。我的背景是 SKNode 类。 self.physicsWorld.contactDelegate = self.prepareBackgroundObj;此处显示警告消息。
    • 您需要将联系人委托设置为实现didBeginContact 方法的任何对象,并且您需要该对象的类@interface 声明包含&lt;SKPhysicsContactDelegate&gt; 协议。
    • 对类别使用#defines 是一个糟糕的选择,这样做会丢失类型检查。更好的选择是使用 NS_OPTIONS 创建位掩码
    • 但是如果我们在 background sknode 中使用 协议,那么它会显示错误消息“在对象类型背景上找不到属性物理世界”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多