2017-08-21 6 views
0

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) 


} 

Antwort

3

Erstens sind einige Ihrer Kategorien falsch:

static let Wall: UInt32 = 3 
static let Bullet: UInt32 = 4 

Dies definiert effektiv Wall als sowohl eine Boat und eine Enemy. Ändern Sie sie zu:

static let Wall: UInt32 = 4 
static let Bullet: UInt32 = 8 

(Kategorien sollten immer einzigartige Kräfte von 2 - 1, 2, 4, 8, 16 usw.) sein.

Der Rest sieht gut aus, also versuchen Sie es und lassen Sie uns wissen, ob es funktioniert.

Edit:

OK - habe gerade bemerkt, dass alle Ihre Physik Körper haben ihre isDynamic Eigenschaft auf false gesetzt - dies bedeutet, dass unter anderem der Körper keine Kontakte auslösen. Wenn also die Rakete Kontakte mit Feind oder Boot erzeugen soll, sollte entweder eine Rakete dynamisch sein oder sowohl der Feind als auch das Boot sollten dynamisch sein (nur 1 der 2 Objekte, die an einem Kontakt beteiligt sind, muss dynamisch sein).

+0

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. –

+0

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

+0

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) .. –