ios - स्विफ्ट, स्प्राइट किट में टक्कर का पता कैसे लगाएं
swift sprite-kit (1)
-
अद्वितीय श्रेणियों को परिभाषित करें, सुनिश्चित करें कि आपकी कक्षा
SKPhysicsContactDelegate
और अपने आप को भौतिकी संपर्क प्रतिनिधिSKPhysicsContactDelegate
:
//Physics categories
let enemyCategory: UInt32 = 1 << 1
let bulletCategory: UInt32 = 1 << 2
class GameScene: SKScene, SKPhysicsContactDelegate {
physicsWorld.contactDelegate = self
-
श्रेणियां असाइन करें (आमतौर पर
didMove(to view:)
में:didMove(to view:)
enemy.physicsBody.catgeoryBitMask = enemyCategory bullet.physicsBody.catgeoryBitMask = bulletCategory
(सुनिश्चित करें कि आपने प्रत्येक नोड के लिए भौतिक निकाय बनाए हैं)
- टकराव सेट करें:
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
}
-
संपर्क स्थापित करें
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)
दुर्भाग्य से यह सांत्वना में कुछ भी नहीं छापता है जब मैं दो वस्तुओं को छूता हूं।