2016-08-02 8 views
0

Ich habe ein seltsames Problem, wo meine SKReferenceNode nicht ordnungsgemäß kollidiert nach dem Hochskalieren. Es kollidiert gut in der Mitte, aber es ignoriert Kollisionen und Kontakte an den Rändern.Swift Kollision funktioniert nicht nach SKReferenceNode Scale

Here is the first photo of the scene. Der SKReferenceNode wurde signifikant vergrößert und, wie in this Foto zu sehen ist, kollidiert nicht korrekt an den Rändern. Der PhysicsBody scheint korrekt zu sein (mit showPhysics on), aber der Ball weigert sich zu kollidieren.

Der SKReferenceNode verwendet eine Alpha-Kollisionsmaske, weil ich ihn in Zukunft in ein größeres Sprite umwandeln muss, um Animationen und ähnliches zu machen. Darüber hinaus funktionieren nicht skalierte Objekte vollständig. Schließlich, nachdem der Ball mit der Mitte kollidiert ist, was funktioniert, und der Block zurückgesetzt wird, beginnen Kollisionen wieder wie erwartet zu arbeiten. Der Code, um es zu beheben, ist wahrscheinlich in der Reset-Funktion, aber ich setze alles zurück, bevor die Ebene geladen wird, also würde dies keinen Sinn ergeben. Hier ist ein Teil meines Reset-Code:

func reset() { 
    physicsWorld.gravity = CGVectorMake(0, -9.8) 
    for grav in gravityBlock { 
     grav.reset() 
    } 

    gravity = -9.8 

    //Resets blocks 
    for blocks in destroyedBlocks { //the blocks are stored in destroyedBlocks when collided with 
     blocks.reset() 
    } 

    destroyedBlocks = [] 

    /*Irrelevant code removed*/ 
    } 

Hier ist meine blocks.reset() Funktion:

override func reset() { 
    super.reset() 

    self.physicsBody?.categoryBitMask = 1 
    removeAllActions() 

    self.texture = self.text 
    shadow.hidden = false 

    self.alpha = 0 
    shadow.alpha = 0 

    let appear = SKAction(named: "Appear")! 
    self.runAction(appear) 
    shadow.runAction(SKAction.fadeInWithDuration(0.25)) 
} 

Hier ist super.reset()

func reset() { 
    self.hidden = false 
    state = .NotBroken 
} 

Thanks so much!

Antwort

0

Wenn Sie das Sprite skalieren, ändern Sie nur seine visuelle Darstellung. Der Physikkörper bleibt derselbe. Deshalb bekommen Sie während der Kollisionen das "Seltsame".

können Sie sehen, dass die Physik zeigt, die in der Szene verwendet, öffnen Sie einfach GameViewController und fügen Sie diese Zeile

skView.showsPhysics = true 

innen viewDidLoad, gerade nach dieser Zeile

skView.showsNodeCount = true 

Dann wieder das Spiel laufen, Die physikalischen Grenzen werden jetzt hervorgehoben.

+0

Ich habe das schon probiert, [hier] (http://i.imgur.com/ZC40jam.png) ist ein Link zu einem Bild. Der physicsBody deckt den gesamten Block ab, kollidiert aber trotzdem nicht. –