首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKPhysicsContact有没有办法确定A和B是哪个身体?

SKPhysicsContact有没有办法确定A和B是哪个身体?
EN

Stack Overflow用户
提问于 2016-11-05 08:38:20
回答 2查看 837关注 0票数 4

在SpriteKit中,我们检测didBeginContact方法中的in。但是这样做看起来有点愚蠢: func didBeginContact(联系人: SKPhysicsContact) {

代码语言:javascript
复制
    if let contactA = contact.bodyA.node?.name {

        if let contactB = contact.bodyB.node?.name {

            //now that we have safely unwrapped these nodes, we can operate on them

            if contactA == "ball" {

                collisionBetweenBall(contact.bodyA.node!, object: contact.bodyB.node!)

            } else if contactB == "ball" {

                collisionBetweenBall(contact.bodyB.node!, object: contact.bodyA.node!)

            }

        }

    }

}

有什么办法可以确保bodyA总是一个球吗?有与分类掩码相关的规则吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-05 08:51:43

如果您使用的是简单的类别,而每个物理体只属于一个类别,那么这种可供选择的didBeginContact形式可能更容易读懂:

代码语言:javascript
复制
func didBeginContact(contact: SKPhysicsContact) {
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

switch contactMask {

   case categoryBitMask.ball | categoryBitMask.something:
       print("Collision between ball and something")
       let ballNode = contact.bodyA.categoryBitMask == categoryBitMask.ball ? contact.bodyA.node! : contact.bodyB.node!
       ballNode.pop()
       score += 10

   default :
       //Some other contact has occurred
       print("Some other contact")
   }
}

请注意,如果您的类别更复杂,这将无法工作,因为简单和测试(categoryBitMask.ball | categoryBitMask.something)将不匹配。

票数 6
EN

Stack Overflow用户

发布于 2016-11-11 21:57:13

通常你会这么做

首先,如果您还没有存储位掩码类别,就会存储它。

代码语言:javascript
复制
enum PhysicsCategory {
     static let ball: UInt32 =  0x1 << 0
     static let wall: UInt32 =  0x1 << 1
     static let enemy: UInt32 = 0x1 << 2
}

而不是像这样把它们分配给你的精灵

代码语言:javascript
复制
 ball.physicsBody?.categoryBitMask = PhysicsCategory.ball
 ball.physicsBody?.contactTestBitMask = PhysicsCategory.wall | PhysicsCategory.enemy

 wall.physicsBody?.categoryBitMask = PhysicsCategory.wall
 wall.physicsBody?.contactTestBitMask = 0 

 enemy.physicsBody?.categoryBitMask = PhysicsCategory.enemy
 enemy.physicsBody?.contactTestBitMask = 0 

注意:因为在这个例子中,球检查与墙壁和敌人的接触,所以你不需要告诉墙或敌人去检查与球的接触。可以在1物理体上做这件事,这样你就可以在其他人身上设置为0,除非他们有其他特定的联系人需要寻找。

在没有双if语句的情况下,您可以在contact方法中检查它们。

代码语言:javascript
复制
func didBegin(_ contact: SKPhysicsContact) {

    let firstBody: SKPhysicsBody
    let secondBody: SKPhysicsBody

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


    // Ball hit wall or wall hit ball
    if (firstBody.categoryBitMask == PhysicsCategory.ball) && (secondBody.categoryBitMask == PhysicsCategory.wall) {

          // Some code
    }

    // Ball hit enemy or enemy hit ball
    if (firstBody.categoryBitMask == PhysicsCategory.ball) && (secondBody.categoryBitMask == PhysicsCategory.enemy) {

          // Some code
    }
}

另外,不要忘记在场景的didMoveToView中设置委托以使其工作。

代码语言:javascript
复制
physicsWorld.contactDelegate = self

希望这能有所帮助

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40436300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档