2016-03-31 6 views
2

Wenn Spieler Körper treffen ein Monster Körper die Funktion func didBeginContact(contact: SKPhysicsContact) wird nie aufgerufen.Sprite Kit nie meine Kollision

Meine Klasse SKPhysicsContactDelegate

class GameScene: SKScene, SKPhysicsContactDelegate 

die Eigenschaft implementieren collisionBitMask ich es kommentiert, weil ich gelesen, dass wenn wir es nicht gesetzt, wird der Knoten mit allen Knoten collise kann

ich meinen Player wie folgt hinzu:

bear.position = CGPoint(x:self.frame.width/20, y:self.frame.height/5) 
bear.size = CGSize(width: self.frame.width/7, height: self.frame.height/5) 
bear.physicsBody = SKPhysicsBody(rectangleOfSize: bear.frame.size) 
bear.physicsBody?.dynamic = false; 
bear.physicsBody?.categoryBitMask = PhysicsCategory.Player 
bear.physicsBody?.contactTestBitMask = PhysicsCategory.Monster 
//bear.physicsBody?.collisionBitMask = PhysicsCategory.Monster 

ich hinzufügen Monster wie folgt aus:

  let thePosition = CGPoint(x: positionX, y: (self.frame.height/7.4)*positionY) 

     let monster = SKSpriteNode(imageNamed: pattern as String) 
     monster.size = CGSize(width: self.frame.width/16, height: self.frame.height/11) 
     monster.name = name 
     monster.position = thePosition 


     monster.physicsBody = SKPhysicsBody(rectangleOfSize: monster.frame.size) 



     monster.physicsBody?.dynamic = false 
     monster.physicsBody?.categoryBitMask = PhysicsCategory.Monster // 3 
     monster.physicsBody?.affectedByGravity = false 
     monster.physicsBody?.contactTestBitMask = PhysicsCategory.Player // 4 
     //platformNode.physicsBody?.collisionBitMask = PhysicsCategory.Player // 5 


     addChild(monster) 

mein PhysicalCategory

struct PhysicsCategory { 
    static let None  : UInt32 = 0 
    static let All  : UInt32 = UInt32.max 
    static let Player: UInt32 = 0b1  // 1 
    static let Monster : UInt32 = 0b10  // 2 
    static let Projectile: UInt32 = 0b100  // 3 
    static let Plateforme: UInt32 = 0b1000  // 4 
} 

Ich habe mehrere Texturen, zum Beispiel, wenn der Spieler zu Fuß Ich nenne das:

func walkingBear() { 
    bear.runAction( SKAction.repeatActionForever(SKAction.animateWithTextures(bearCoursFrames, timePerFrame: 0.1, resize: false, restore: true)), withKey:"cours") 
    } 

I initlaise bearCoursFrames wie diese

var walkFrames = [SKTexture]() 
    var numImages : Int = bearAnimatedAtlas.textureNames.count 
    for var i=1; i<=numImages/2; i++ { 
     let bearTextureName = "cours\(i)" 
     walkFrames.append(bearAnimatedAtlas.textureNamed(bearTextureName)) 
    } 

    bearCoursFrames = walkFrames 

Wo ist mein Fehler bitte, ich ca keine lösung in anderen post finden jede hilfe wäre willkommen

------------------------------- --EDIT ------------------------------ Lösung: Ich füge gerade self.physicsWorld.contactDelegate = selbst hinzu und es funktioniert jetzt .

Antwort

1

ich nur hinzufügen,

 self.physicsWorld.contactDelegate = self 

und es funktioniert jetzt.

+0

Lol ja, ich nahm an, dass schon getan ... Es ist einfach nicht genug SKScene machen SKPhysicsContactDelegate Protokoll entspricht ... – Whirlwind

+0

ich völlig vergessen, und ich verlor lol mehrere Stunden Lösung suchen, aber deine antwort hat mir geholfen, weil ich nicht für dynamik wusste, dass ich mindestens einen aktivieren muss, und auch phisical body :) – tamtoum1987

2

Die Antwort ist einfach. Es gibt eine Regel, die besagt, dass mindestens ein Körper als dynamisch definiert werden muss, um den Kontakt zu registrieren.

Ändern Sie entweder den Player oder einen anderen Körper, um dynamisch zu sein, und der Kontakt wird erkannt.

Als Ergänzung, wenn Sie noch nicht haben, aktivieren Sie die visuelle Darstellung der Physik ... Es kann hilfreich sein, weil manchmal Kontakt nicht erkannt wird, weil die tatsächlichen Körper sich nicht schneiden z. Wenn der Ankerpunkt des Knotens geändert wird, werden die Textur und der Körper falsch platziert (was mit den entsprechenden Initialisierern der SKPhysicsBody-Klasse behoben werden kann, aber dies ist ein sehr häufiger Fehler).

+0

Ich versuche es einfach, dynamisch = wahr, aber ich habe das gleiche Problem, wenn ich diesen bär.physicsBody setzen? .collisionBitMask wenn Spieler treffen Monster Körper, den er Richtung ändern, und ihn nie treffen, in den beiden Fällen didBeginContact nie aufgerufen :( – tamtoum1987

+0

ich aktiviert aktivieren physik visuelle darstellung ich kann sehen die beiden körper erfüllt – tamtoum1987

+0

Okay, wird ihr beispiel genau betrachten, wenn ich vor dem computer. – Whirlwind