应用SKPhysicsBody后检测SKPhysicsBody碰撞

时间:2016-12-31 22:44:01

标签: ios swift swift3 game-physics skphysicsbody

我有简单的游戏玩法,其功能如下:

enter image description here

我的目标是检测球何时击中白色部分(场景上的游戏会加载)或当球击中灰色部分时(游戏继续)

因为形状缩小并且有很多东西在进行,我认为在需要时创建SKPhysicsBody会更有效率,然后在碰撞检查发生后将其删除。所以,当我点击屏幕时,会发生这种情况:(在5 * 0.0325秒后 - 圆圈缩小需要多长时间 - 已经过去了,它会将物理体添加到灰色和白色部分,这样我就可以检测出球是哪个触摸)

DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute: {
        let trackPhysics = SKPhysicsBody(texture: track.texture!, size: track.texture!.size())
        trackPhysics.isDynamic = false
        trackPhysics.affectedByGravity = false
        track.physicsBody = trackPhysics

        let goalPhysics = SKPhysicsBody(texture: goal.texture!, size: goal.texture!.size())
        goalPhysics.isDynamic = false
        goalPhysics.affectedByGravity = false
        goal.physicsBody = goalPhysics
    })

哪个有效。 SKPhysicsBody完美地应用于灰色和白色部分,没有任何帧速率损失并跟随旋转。问题是......如何检测球接触的是哪个?由于它们没有正式碰撞,它根本不会调用碰撞(这是有意义的,因为它们并没有真正碰撞

这是基本逻辑,在我想检查结果之前它完美运行:

  1. 有人触摸屏幕
  2. circle shrink
  3. 缩小后立即根据纹理为灰色和白色部分创建一个SKPhysicsBody
  4. 问题在这里......我如何检测球正在接触?
  5. 我试过这个:

        func didBegin(_ contact: SKPhysicsContact) {
            print("touching!")
        }
    
        func didEnd(_ contact: SKPhysicsContact) {
            print("not touching")
        }
    

    根本没有消息,并且在应用SKPhysicsBody后1秒尝试使用allContactedBodies(),但是对所有这些都返回0的计数。我甚至尝试过这5秒但仍然没有工作

    DispatchQueue.main.asyncAfter(deadline: .now() + seconds + 1, execute: {
            print(track.physicsBody!.allContactedBodies().count)
            print(goal.physicsBody!.allContactedBodies().count)
        })
    

    这是应用SKPhysicsBody的样子,你可以看到物理应用完美

    enter image description here

    我做错了吗?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

解决方案(如上面评论中所发现的)是:

  1. 将节点的isDynamic属性设置为true以使碰撞检测正常工作。
  2. 通过仔细检查场景的didBegin(contact:)是否已设置,确保正在调用physicsWorld.contactDelegate
  3. 确保将面具和物理主体设置在适当的时间和位置。