Il y a 3 SKSpriteNode dans ma classe SKScene. L'un d'eux est joueur et les autres sont en or et objet de finition invisible comme lorsque le joueur le touche, le jeu est terminé. Mon problème est que lorsque le joueur entre en collision avec l'or, son budget en or devrait augmenter de seulement 50 pièces d'or. Cependant, Xcode détecte plusieurs collisions et le budget d'or augmente plusieurs fois. 50-60 collision est détectée au lieu d'une collision. J'ai étudié comment résoudre ce problème. J'ai trouvé que je devrais utiliser Bool, j'ai essayé de définir bool mais cela n'a pas résolu mon problème. Est-ce que quelqu'un peut m'aider sur la façon de détecter une seule collision? Voici les codes de ma classe GameScene:SpriteKit détectant plusieurs collisions au lieu d'une seule fois (Swift 3)
import SpriteKit
import GameplayKit
class level3: SKScene, SKPhysicsContactDelegate {
let playerFileName = "player"
let starFileName = "50Gold"
let goalFileName = "goal"
let playerCategory : UInt32 = 0x1 << 1
let goalCategory : UInt32 = 0x1 << 2
let starCategory : UInt32 = 0x1 << 3
override func didMove(to view: SKView) {
super.didMove(to: view)
physicsWorld.contactDelegate = self
let goal = childNode(withName: goalFileName) as! SKSpriteNode
let player = childNode(withName: playerFileName) as! SKSpriteNode
let star = childNode(withName: starFileName) as! SKSpriteNode
player.physicsBody!.categoryBitMask = playerCategory
goal.physicsBody!.categoryBitMask = goalCategory
star.physicsBody?.collisionBitMask = 1
player.physicsBody?.collisionBitMask = 1
goal.physicsBody?.collisionBitMask = 1
goal.physicsBody?.isDynamic = true
goal.physicsBody!.contactTestBitMask = playerCategory
player.physicsBody?.isDynamic = true
star.physicsBody?.isDynamic = true
player.physicsBody?.contactTestBitMask = starCategory
star.physicsBody?.categoryBitMask = starCategory
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
}
if firstBody.categoryBitMask == playerCategory && secondBody.categoryBitMask == goalCategory {
contact.bodyB.node?.removeFromParent()
}
if firstBody.categoryBitMask == playerCategory && secondBody.categoryBitMask == starCategory {
PlaySceneViewController.instance.gold += 50
print(PlaySceneViewController.instance.gold)
contact.bodyB.node?.removeFromParent()
}
}
}
}
Suppression du tag Xcode et référence dans le titre, car cela est un problème que vous rencontrez la mise en œuvre quelque chose avec SpriteKit, pas un problème avec il Xcode IDE –
Check ma réponse à une question très similaire ici: https://stackoverflow.com/a/44384390/1430420 –