Ich erhalte Schwierigkeiten bei der Erkennung von Kollisionen in meinem SpriteKit-Spiel. Ich möchte einfach eine Kollision zwischen den Raketen und den Feinden und Booten feststellen.Kollision wird nicht erkannt
Ich habe die ColliderType:
struct ColliderType {
static let Boat: UInt32 = 1
static let Enemy: UInt32 = 2
static let Wall: UInt32 = 3
static let Bullet: UInt32 = 4
}
class GameplayScene: SKScene, SKPhysicsContactDelegate {
var player = SKSpriteNode()
var enemy = SKSpriteNode()
var boat = SKSpriteNode()
var missile = SKSpriteNode()
Der didBegin Kontakt:
func didBegin(_ contact: SKPhysicsContact) {
var firstBody = SKPhysicsBody()
var secondBody = SKPhysicsBody()
if contact.bodyA.node?.name == "Missile" {
firstBody = contact.bodyA
secondBody = contact.bodyB
} else {
firstBody = contact.bodyB
secondBody = contact.bodyA
}
if firstBody.node?.name == "Missile" && secondBody.node?.name ==
"Enemy" {
incrementScore()
secondBody.node?.removeFromParent()
} else if firstBody.node?.name == "Missile" &&
secondBody.node?.name == "Boat" {
incrementScore()
}
}
- ich die "physicsWorld.contactDelegate = self" hinzugefügt haben, in der didMove toview
Zu allen relevanten Spritenodes habe ich auch PhysikBodies hinzugefügt:
func fireMissile() {
let missile = SKSpriteNode(color: .yellow, size: CGSize(width: 20,
height: 5))
missile.name = "Missile"
missile.position = CGPoint(x: player.position.x + 28, y:
player.position.y + 10)
missile.zPosition = 2
missile.physicsBody = SKPhysicsBody(rectangleOf: missile.size)
missile.physicsBody?.isDynamic = false
missile.physicsBody?.categoryBitMask = ColliderType.Bullet
missile.physicsBody?.collisionBitMask = ColliderType.Enemy |
ColliderType.Boat
missile.physicsBody?.contactTestBitMask = ColliderType.Enemy |
ColliderType.Boat
self.addChild(missile)
}
func createEnemies() {
let enemy = SKSpriteNode(imageNamed: "Enemy1")
enemy.name = "Enemy"
enemy.anchorPoint = CGPoint(x: 0.5, y: 0.5)
enemy.physicsBody = SKPhysicsBody(circleOfRadius: enemy.size.height
/2)
enemy.physicsBody?.categoryBitMask = ColliderType.Enemy
enemy.physicsBody?.affectedByGravity = false
enemy.physicsBody?.isDynamic = false
enemy.zPosition = 3
enemy.position.y = self.frame.height + 100
enemy.position.x = CGFloat.randomBetweenNumbers(firstNum: -347.5,
secondNum: -85)
self.addChild(enemy)
}
func createBoat() {
let boat = SKSpriteNode(imageNamed: "Boat")
boat.name = "Boat"
boat.anchorPoint = CGPoint(x: 0.5, y: 0.5)
boat.physicsBody = SKPhysicsBody(circleOfRadius: boat.size.height/
2)
boat.physicsBody?.categoryBitMask = ColliderType.Boat
boat.physicsBody?.affectedByGravity = false
boat.physicsBody?.isDynamic = false
boat.zPosition = 3
boat.position.y = self.frame.height + 100
boat.position.x = CGFloat.randomBetweenNumbers(firstNum: 0,
secondNum: 0)
self.addChild(boat)
}
Ich habe eine lange Post auf der Dokumentations-Website darüber, wie die Bitmasken in Sprite-Kit funktionieren, aber ich kann keinen Link mehr darauf veröffentlichen, weil die Dokumentation bald entfernt wird. –
Ich habe das geändert, aber es funktioniert immer noch nicht. Ich habe versucht, Kollisionen mit allen anderen Kategorien zu entdecken, und keiner von ihnen funktioniert auch:/ – Flinigan
OK - habe gerade bemerkt, dass alle deine Physik-Körper ihre 'isDynamic'-Eigenschaft auf false gesetzt haben - das bedeutet, dass unter anderem Der Körper wird keine Kontakte auslösen. Wenn du also "Rakete" mit "Feind" oder "Boot" verbinden willst, dann sollte entweder eine Rakete dynamisch sein oder beides sollte Feind und Boot sein (nur 1 der 2 Objekte in einem Kontakt muss dynamisch sein) .. –