ios - स्विफ्ट, स्प्राइट किट में टक्कर का पता कैसे लगाएं



swift sprite-kit (1)

  1. अद्वितीय श्रेणियों को परिभाषित करें, सुनिश्चित करें कि आपकी कक्षा SKPhysicsContactDelegate और अपने आप को भौतिकी संपर्क प्रतिनिधि SKPhysicsContactDelegate :

//Physics categories

let enemyCategory:    UInt32 = 1 << 1
let bulletCategory:   UInt32 = 1 << 2

class GameScene: SKScene, SKPhysicsContactDelegate {
   physicsWorld.contactDelegate = self
  1. श्रेणियां असाइन करें (आमतौर पर didMove(to view:) में: didMove(to view:)

    enemy.physicsBody.catgeoryBitMask = enemyCategory bullet.physicsBody.catgeoryBitMask = bulletCategory

(सुनिश्चित करें कि आपने प्रत्येक नोड के लिए भौतिक निकाय बनाए हैं)

  1. टकराव सेट करें:

enemy.physicsBody?.collisionBitMask = 0 // enemy collides with nothing bullet.physicsBody?.collisionBitMask = 0 // bullet collides with nothing

या और भी:

for node in [enemy, bullet] {
   node.physicsBody?.collisionBitMask = 0 //  collides with nothing
   }
  1. संपर्क स्थापित करें

    bullet.physicsBody?.collisionBitMask = enemyCategory // bullet contacts enemy

सुनिश्चित करें कि प्रत्येक संभावित संपर्क में शामिल कम से कम एक वस्तु के पास अपने भौतिक शरीर पर isDynamic संपत्ति है जो isDynamic पर सेट true , या कोई संपर्क उत्पन्न नहीं होगा। दोनों वस्तुओं का गतिशील होना आवश्यक नहीं है।

आपको अब didBegin चाहिए जब बुलेट और दुश्मन संपर्क करें। आप इस तरह से कोड कर सकते हैं:

  func didBegin(_ contact: SKPhysicsContact) {
     print("didBeginContact entered for \(String(describing: contact.bodyA.node!.name)) and \(String(describing: contact.bodyB.node!.name))")

     let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

     switch contactMask {
     case bulletCategory | enemyCategory:
        print("bullet and enemy have contacted.")
        let bulletNode = contact.bodyA.categoryBitMask == bulletCategory ? contact.bodyA.node : contact.bodyB.node
        enemyHealth -= 10
        bulletNode.removeFromParent
     default:
        print("Some other contact occurred")
     }

}

मैं स्विफ्ट में इस सरल अंतरिक्ष खेल की प्रोग्रामिंग कर रहा था जब तक कि मुझे टकराव का पता लगाने की समस्या का सामना नहीं करना पड़ा। मंचों, ट्यूटोरियल इत्यादि को देखने के बाद, मैंने बिटकॉइन घोषित करके टकराव को लागू करने की कोशिश की:

वस्तु १

    enemy?.physicsBody = SKPhysicsBody(circleOfRadius: ((enemy?.size.width)!/2))
    enemy?.physicsBody?.categoryBitMask = enemyBitMask
    enemy?.physicsBody?.contactTestBitMask = bulletBitMask
    enemy?.physicsBody?.collisionBitMask = 0

वस्तु २

    bullet?.physicsBody? = SKPhysicsBody(rectangleOf: (bullet?.size)!)
    bullet?.physicsBody?.categoryBitMask =  bulletBitMask
    bullet?.physicsBody?.contactTestBitMask =  enemyBitMask
    bullet?.physicsBody?.collisionBitMask = 0
    bullet?.physicsBody?.usesPreciseCollisionDetection = true

मैंने इसमें एक प्रिंट स्टेटमेंट भी डाला

func didBegin(_ contact: SKPhysicsContact) { print("Hello") }

यहां बताया गया है कि मैं अपने स्प्राइट्स को कैसे कॉन्फ़िगर करता हूं:

    func CreateNewEnemy() {
    var enemy : SKSpriteNode?

       let moveEnemyDown = SKAction.repeatForever(SKAction.moveBy(x: 0, y: -1, duration: 0.01))
       let rotateEnemy = SKAction.repeatForever(SKAction.rotate(byAngle: 25, duration: 5))

      let enemyXpos = randomNum(high:  self.frame.size.width/2, low: -1 * self.frame.size.width/2)
      let enemyYpos = randomNum(high:  2.5*self.frame.size.height, low: self.frame.size.height/2)
      let enemyOrigin : CGPoint = CGPoint(x: enemyXpos, y: enemyYpos)

      enemy = SKSpriteNode(imageNamed: possibleEnemyImage[Int(arc4random_uniform(4))])
      print(enemy?.size.height)
      enemy?.scale(to: CGSize(width: player.size.height, height: player.size.height))
      print(enemy?.size.height)
      enemy?.position = enemyOrigin
      enemy?.run(moveEnemyDown)
      enemy?.run(rotateEnemy)
      let enemyRadius : CGFloat = (enemy?.size.width)!/2
      print(enemyRadius)

      enemy?.physicsBody? = SKPhysicsBody(circleOfRadius: enemyRadius)

      enemy?.physicsBody?.categoryBitMask = enemyCategory
      enemy?.physicsBody?.contactTestBitMask = bulletCategory
      enemy?.physicsBody?.collisionBitMask = 0
      enemy?.zPosition = 1

      enemiesArray.append(enemy!)
      self.addChild(enemy!)
}

दुश्मन बनाने के लिए (फंक्शन देखने के लिए किया गया कदम)

    func CreateAllEnemies(amountOfEnemies : UInt8) {
    for _ in 0...amountOfEnemies {
        CreateNewEnemy()
    }
}

और दूसरा प्रेत

    func CreateNewBullet() {
     let bulletOrigin : CGPoint = CGPoint(x: player.position.x, y: player.position.y+player.size.height/2)
     let moveBulletUp = SKAction.repeatForever(SKAction.moveBy(x: 0, y: 3, duration: 0.01))

     var bullet : SKSpriteNode?
     bullet = SKSpriteNode(imageNamed: "bulletImage")
     bullet?.position = bulletOrigin
     bullet?.run(moveBulletUp)

     bullet?.physicsBody? = SKPhysicsBody(rectangleOf: (bullet?.size)!)
     bullet?.physicsBody?.categoryBitMask =  bulletCategory
     bullet?.physicsBody?.contactTestBitMask = enemyCategory
     bullet?.physicsBody?.collisionBitMask = 0
     bullet?.physicsBody?.isDynamic = true
     bullet?.physicsBody?.usesPreciseCollisionDetection = true
     bullet?.zPosition = 1

     bulletsArray.append(bullet!)
     self.addChild(bullet!)
}

यह एक टाइमर के साथ बनाया गया है

bulletTimer = Timer.scheduledTimer(timeInterval: 0.25, target: self, selector: #selector(CreateNewBullet) , userInfo: nil, repeats: true)

दुर्भाग्य से यह सांत्वना में कुछ भी नहीं छापता है जब मैं दो वस्तुओं को छूता हूं।





skphysicsbody