gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:27:33 29 4
gpt4 key购买 nike

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

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. 圈子缩小
  3. 在它们收缩之后,它会根据纹理为灰色和白色部分创建一个 SKPhysicsBody
  4. 问题来了……我如何检测哪个球正在接触?

我试过这个:

    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. 将节点的 isDynamic 属性设置为 true 以使碰撞检测正常工作。
  2. 通过仔细检查场景的 physicsWorld.contactDelegate 是否已设置,确保正在调用 didBegin(contact:)
  3. 确保在正确的时间和位置设置 mask 和物理体。

关于ios - 在应用 SKPhysicsBody 后检测 SKPhysicsBody 碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41412183/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com