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

ios - 应用SKPhysicsBody后检测SKPhysicsBody碰撞-LMLPHP

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

因为形状会缩小并且会发生很多事情,所以我认为仅在需要时创建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可以完美地应用于灰色和白色部分,而不会降低帧速率,并且可以跟随旋转。问题是...我该如何检测哪个球在碰?由于它们没有正式碰撞,因此根本不会调用碰撞(这很有意义,因为它们并未真正碰撞

这是基本逻辑,在我要检查结果之前,它可以完美地工作:
  • 有人触摸屏幕
  • 圈子缩小
  • 缩小后,将根据其纹理
  • 为灰色和白色部分创建一个SKPhysicsBody
  • 问题在这里...我如何检测哪个球在碰?

  • 我已经试过了:
        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的样子,您可以看到物理已完美地应用了

    ios - 应用SKPhysicsBody后检测SKPhysicsBody碰撞-LMLPHP

    难道我做错了什么?有任何想法吗?

    最佳答案

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

  • 将节点的isDynamic属性设置为true,以使冲突检测正常工作。
  • 通过仔细检查场景的didBegin(contact:)是否已设置,确保正在调用physicsWorld.contactDelegate
  • 确保将遮罩和物理主体设置在正确的时间和位置。
  • 关于ios - 应用SKPhysicsBody后检测SKPhysicsBody碰撞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41412183/

    10-11 14:44