2017-04-20 4 views
0

Grundsätzlich habe ich den Boden, den Spieler (Raymond) und Münzen. Wenn der Spieler den Boden berührt, sollte nichts passieren, das Spiel geht normal weiter. Wenn der Spieler mit der Münze in Kontakt kommt, möchte ich auf der Konsole "Münzkontakt mit Spieler" drucken.Sprite Kit Kontakt Erkennung

enum ColliderType: UInt32 { 
    case Raymond = 1 
    case Object = 2 
    case Coin = 3 
} 

Raymonds Physik

raymond.physicsBody = SKPhysicsBody(circleOfRadius: raymondTexture.size().height/2) 
    raymond.physicsBody!.dynamic = true 

    raymond.physicsBody!.categoryBitMask = ColliderType.Raymond.rawValue 
    raymond.physicsBody?.contactTestBitMask = ColliderType.Object.rawValue 
    raymond.physicsBody?.collisionBitMask = ColliderType.Object.rawValue 

Münzen Physik

 coin.physicsBody = SKPhysicsBody(circleOfRadius: raymondTexture.size().height/2) 
    coin.physicsBody!.dynamic = true 

    coin.physicsBody!.categoryBitMask = ColliderType.Coin.rawValue 
    coin.physicsBody?.contactTestBitMask = ColliderType.Raymond.rawValue 
    coin.physicsBody?.collisionBitMask = ColliderType.Object.rawValue 

Bodenphysik, wenn Sie

 ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, 1)) 
    ground.physicsBody!.dynamic = false 
    ground.physicsBody!.categoryBitMask = ColliderType.Object.rawValue 
    ground.physicsBody?.contactTestBitMask = ColliderType.Object.rawValue 
    ground.physicsBody?.collisionBitMask = ColliderType.Object.rawValue 

Heres die Kontaktfunktion brauche ich habe, ich seine falsch wissen und ich brauche Hilfe bei der Erkennung der Berühren von Münzen und Raymond.

func didBeginContact(contact: SKPhysicsContact) { 
    print("coin contact with player") 

} 

Vielen Dank im Voraus.

+0

Können Sie fügen Sie mehr von Ihrem Code SKPhysicsContactDelegate, vorzugsweise, wenn Sie angeben, die Physik –

+0

@OrenEdrich done . –

+1

Sie verwenden keine Bitmasken korrekt, 3 bedeutet 0000000000000000000000000000000011 was wirklich bedeutet, dass Objekt & Raym0nd. Du musst in Zweierpotenzen arbeiten, also ist die nächste brauchbare Zahl 4 (1,2,4,8,16,32) Wenn du es lesbar machen willst, dann benutze (1 << 2) für deine Münze (1 << 0) für Ihr Objekt und (1 << 1) für Ihr Raymond – Knight0fDragon

Antwort

0

Es gibt wirklich mehrere Möglichkeiten, dies zu überprüfen, Hier sind 2 der wichtigsten Möglichkeiten, um loszulegen. Der erste prüft den Namen des Kontakts und der zweite überprüft die CategoryBitMask. Es ist erwähnenswert, dass wenn Ihre PhysicsBodies Bitmasken nicht richtig eingestellt sind, der Kontakt möglicherweise nie zwischen zwei Objekten gemeldet wird.

bearbeiten Stellen Sie sicher, die Szene entspricht

class GameScene: SKScene, SKPhysicsContactDelegate 

...

func didBegin(_ contact: SKPhysicsContact) { 

    let contactAName = contact.bodyA.node?.name 
    let contactBName = contact.bodyB.node?.name 

    if (contactAName == "raymond") || (contactBName == "raymond") { 

     if (contactAName == "coin") || (contactBName == "coin") { 
      print("coin contact with player") 
      return 
     } 
    } 

    //or 

    if contact.bodyA.categoryBitMask == ColliderType.Coin || contact.bodyB.categoryBitMask == ColliderType.Coin { 

     if contact.bodyA.categoryBitMask == ColliderType.Raymond || contact.bodyB.categoryBitMask == ColliderType.Raymond { 
      print("coin contact with player") 
      return 
     } 
    } 
} 
+0

Vielen Dank für die schnelle Antwort, sind meine Physikkörper richtig eingestellt? –

+0

scheinen sie zu sein. Sie brauchen nicht den rawValue am Ende aber –

+0

in Ordnung, gut, wenn Raymond und die Münzen berühren, es nicht zu Konsole drucken. –