【问题标题】:touch location from all contacted bodies从所有接触的身体接触位置
【发布时间】:2021-05-26 17:36:46
【问题描述】:

早安,

如何通过 allContactedBodies 获取两个 Physicsbody 之间的接触位置? 由于我的应用程序的结构,我不能使用 Physicsbody 中的 touchesBegan 方法,但必须通过 Spritekit 中的 allContactedBodies() 手动检查它。但是有没有一种方法可以同时获得触摸发生的点?

这是我检查联系人的方式,但现在我还需要联系人的位置

if let unwrapped_allContactedBodies = spriteObject.spriteNode.physicsBody?.allContactedBodies() {
   if spriteObject.spriteNode.physicsBody?.allContactedBodies().count ?? 0 > 0 {
      return checkForContact(contactedBodies: unwrapped_allContactedBodies, parameter: value)
   } else {
     return 0.0
   }
} else {
  return 0.0
} ´´´


Any Ideas?

【问题讨论】:

  • print(spriteNode.position) 会给你你联系的节点的CGPoint。
  • 当然,但我需要联系开始的时间点
  • 您应该实现 SKPhysicsContactDelegate。请查看发布的答案

标签: swift xcode sprite-kit skspritenode skphysicsbody


【解决方案1】:

您可以使用contact.contactPoint 属性。您必须实现 SKPhysicsContactDelegate。

例子:

enum CollisionTypes: UInt32{
case nodeAColliding = 1
case nodeBColliding = 2
}

 class GameScene: SKScene, SKPhysicsContactDelegate  {


      override func didMove(to view: SKView) {

          physicsWorld.contactDelegate = self
      }

      func createNodes(){
        
         let nodeA = SKSpriteNode(imageNamed: "nodeAImage")
           nodeA.name = "nodeA"
           nodeA.zPosition = 2
           nodeA.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 50   , height: 50))
           nodeA.position = //some CGpoint
           nodeA.physicsBody?.categoryBitMask = CollisionTypes.nodeAColliding.rawValue
           nodeA.physicsBody?.contactTestBitMask = CollisionTypes.nodeBColliding.rawValue
           nodeA.physicsBody?.collisionBitMask = CollisionTypes.nodeBColliding.rawValue
           addChild(nodeA)


         let nodeB = SKSpriteNode(imageNamed: "nodeBImage")
           nodeB.name = "nodeB"
           nodeB.zPosition = 2
           nodeB.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 50   , height: 50))
           nodeB.position = //some CGpoint
           nodeB.physicsBody?.categoryBitMask = CollisionTypes.nodeBColliding.rawValue
           nodeB.physicsBody?.contactTestBitMask = CollisionTypes.nodeAColliding.rawValue
           nodeB.physicsBody?.collisionBitMask = CollisionTypes.nodeAColliding.rawValue
           addChild(nodeB)


      }
      

      func didBegin(_ contact: SKPhysicsContact){
          guard let contactedNodeA = contact.bodyA.node else {return}
          guard let contactedNodeB = contact.bodyB.node else {return}
     
           
          print(contact.contactPoint)
           
          if contactedNodeA.name == "nodeA"{
             //Do something
          }
           
          if contactedNodeA.name == "nodeB"{
             //Do something
          }
      }

  }

注意:我没有在编译器中测试过这段代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多