Spritekit-如何设置两个对象之间的碰撞,使它们像台球一样?

时间:2016-09-23 21:40:54

标签: ios swift sprite-kit skspritenode skphysicsbody

我试图用SpriteKit创建一个台球游戏,但是当涉及到它的物理部分时却遇到了问题。我试图设置它,所以当一个球击中另一个球时,被击中的球会反弹并最终减速并像台球一样停止。我正在使用.sks文件,所有三个球都使用了一个带有摩擦力的边界圆体类型。阻尼和角度。恢复设置为1.恢复原则设置为1.截至目前,当一个球被触摸时,它移动得非常慢,当两个球相互碰撞时,它们只是相互滑动。这就像没有速度一样。到目前为止,这是我的代码:

   let blueBallName = "blueBall"
    let orangeBallName = "orangeBall"
    let pokeBallName = "pokeBall"

    let blueBallCategory : UInt32 = 0x1 << 0
    let orangeBallCategory : UInt32 = 0x1 << 1
    let pokeBallCategory : UInt32 = 0x1 << 2
    let borderCategory : UInt32 = 0x1 << 3


    class PoolScene: SKScene, SKPhysicsContactDelegate {

      var ballPoke : SKSpriteNode?
      var ballBlue : SKSpriteNode?
      var ballOrange : SKSpriteNode?

      var isFingerOnBlueBall = false


      override func didMove(to view: SKView) {

        let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame)
        borderBody.friction = 0
        self.physicsBody = borderBody

        self.physicsWorld.gravity = CGVector(dx: 0, dy: 0)
        physicsWorld.contactDelegate = self

        ballBlue = childNode(withName: blueBallName) as? SKSpriteNode
        ballOrange = childNode(withName: orangeBallName) as? SKSpriteNode
        ballPoke = childNode(withName: pokeBallName) as? SKSpriteNode


        ballBlue?.physicsBody?.categoryBitMask = blueBallCategory
        ballOrange?.physicsBody?.categoryBitMask = orangeBallCategory
        ballPoke?.physicsBody?.categoryBitMask = pokeBallCategory
        borderBody.categoryBitMask = borderCategory


      }

      //Determines which ball user is touching
      override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        let touch = touches.first
    let touchLocation = touch!.location(in: self)

    if let body = physicsWorld.body(at: touchLocation) {
      if body.node!.name == blueBallName {
        print("Blue ball touched")
        isFingerOnBlueBall = true

        let dragBallAction = SKAction.move(to: CGPoint(x: touchLocation.x, y: touchLocation.y), duration: 0.5)

        ballBlue?.run(dragBallAction)


      }
    }
  }
      }

          override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

            isFingerOnBlueBall = false

          }

      func didBegin(_ contact: SKPhysicsContact) {
        // 1.
        var firstBody: SKPhysicsBody
        var secondBody: SKPhysicsBody
        // 2.
        if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
          firstBody = contact.bodyA
          secondBody = contact.bodyB
        } else {
          firstBody = contact.bodyB
          secondBody = contact.bodyA
        }
        // 3.
        if firstBody.categoryBitMask == blueBallCategory && secondBody.categoryBitMask == orangeBallCategory {
          print("Hit Orange ball. First contact has been made.")
        }
      }
    }

1 个答案:

答案 0 :(得分:2)

您正在执行的操作只是MoveTo操作,因此您的精灵会尝试不断移动到那里。尝试使用SKAction施加力,这将向你想要移动到的方向向球施加力,但不会强行施力。它要去你场景中的特定位置,物理引擎应该照顾其余部分。除此之外,我没有看到你为任何球设置了碰撞位掩码,如果你想让它们相互碰撞,你应该设置例如blueBall.collisionBitMask = orangeBallCategory,反之亦然,尽管这对于简单的事情可能不是必需的像这样,它可能没有它。