Es gibt 3 SKSpriteNode in meiner SKScene-Klasse. Einer von ihnen ist Spieler und die anderen sind Gold und unsichtbare Finish-Objekt wie wenn Spieler es berühren, Spiel ist beendet. Mein Problem ist, dass wenn der Spieler mit dem Gold kollidiert, sein Goldbudget nur 50 Gold erhöhen sollte. Xcode erkennt jedoch Mehrfachkollisionen und Goldbudgets, die sich mehrfach erhöhen. Eine 50-60-Kollision wird anstelle einer Kollision erkannt. Ich habe erforscht, wie ich dieses Problem lösen kann. Ich fand, dass ich Bool benutzen sollte, ich habe versucht, bool zu setzen, aber es hat mein Problem nicht gelöst. Kann mir jemand helfen, wie man nur eine Kollision erkennt? Hier ist der meine GameScene Klassencodes:SpriteKit erkennt Mehrfachkollisionen statt einmal (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()
}
}
}
}
Entfernen Xcode-Tages und im Titel, da dies ein Problem, das Sie mit SpriteKit Umsetzung etwas mit, kein Problem mit ihm Xcode IDE –
prüfen meine Antwort auf eine sehr ähnliche Frage hier: https://Stackoverflow.com/a/44384390/1430420 –