2017-03-20 6 views
0

Ich habe Knoten, die jede Sekunde vom oberen Bildschirmrand fallen. Wenn der Player (am unteren Bildschirmrand) mit einem fallenden Knoten kollidiert, möchte ich, dass dieser bestimmte Knoten vom Bildschirm entfernt wird, aber der andere weiter fallen.Swift Entferne 1 Knoten, der sich nach der Kollision bewegt

Ich dachte, node.removeFromParent() könnte dies tun oder alle Knoten entfernen, aber nichts passiert unabhängig davon. Hier

ist, was ich habe:

machen die Knoten fallen:

func makeMete() { 

    let meteTexture = SKTexture(imageNamed: "mete.png") 
    let movementAmount = arc4random() % UInt32(self.frame.width) 
    let meteOffset = CGFloat(movementAmount) - self.frame.width/2 
    let moveMete = SKAction.move(by: CGVector(dx: 0, dy: -2 * self.frame.height), duration: TimeInterval(self.frame.height/300)) 

    let mete = SKSpriteNode(texture: meteTexture) 
    mete.position = CGPoint(x: self.frame.midX + meteOffset, y: self.frame.midY + self.frame.height/2) 

    mete.physicsBody = SKPhysicsBody(circleOfRadius: meteTexture.size().height/2) 
    mete.physicsBody!.isDynamic = false 
    mete.physicsBody!.contactTestBitMask = ColliderType.object.rawValue 
    mete.physicsBody!.categoryBitMask = ColliderType.object.rawValue 
    mete.physicsBody!.collisionBitMask = ColliderType.object.rawValue 

    mete.run(moveMete) 
    self.addChild(mete) 




} 

Detektierkontakt:

func didBegin(_ contact: SKPhysicsContact) { 

    if contact.bodyA.categoryBitMask == ColliderType.object.rawValue || contact.bodyB.categoryBitMask == ColliderType.object.rawValue { 



    player.physicsBody!.velocity = CGVector(dx: 0, dy: 0) 
    isUserInteractionEnabled = false 

    mete.removeFromParent() 


    } 

.removeFromParent() scheint nur für mich zu arbeiten, wenn man es Knoten auf dem Bildschirm. Mehr als funktioniert es nicht.

+0

Die Variable 'mete' bezieht sich immer auf das zuletzt erstellte Mete und nicht auf das Kollisionsdatum. Also wird 'removeFromParent' funktionieren, es wird nur einen anderen Knoten entfernen, den Sie vielleicht nicht bemerkt haben. –

+0

Sie könnten Ihren Code klarer finden, wenn Sie die Physikkategorie "ColliderType.mete" von mete ansprechen. Sind Sie sicher, dass die Bitmasken 'contactTest' und' collision' identisch mit der 'category' sind? Was ist die Kategorie des Spielers? –

Antwort

1

Wenn Sie mete verwenden, verweist es auf das tatsächliche Objekt mete und ich nehme an, dass es viele Messwerte auf dem Bildschirm gibt. Versuchen Sie, auf den tatsächlichen Knoten aus dem Physikkörper zu verweisen und diesen aus dem übergeordneten Element zu entfernen. Ersetzen

if contact.bodyA.categoryBitMask == ColliderType.object.rawValue || contact.bodyB.categoryBitMask == ColliderType.object.rawValue { 

player.physicsBody!.velocity = CGVector(dx: 0, dy: 0) 
isUserInteractionEnabled = false 
mete.removeFromParent() 

} 

Mit

if contact.bodyA.categoryBitMask == ColliderType.object.rawValue { 

     contact.bodyA.node?.removeFromParent() 

}else if contact.bodyB.categoryBitMask == ColliderType.object.rawValue { 
     contact.bodyB.node?.removeFromParent() 
    } 

Die .Node geben Sie auf die tatsächliche Instanz in Frage zugreifen.

Viel Glück!

+0

Super, das funktioniert perfekt, danke !! Ich habe gerade noch eine kleine Frage gestellt, wenn es dir nichts ausmacht, einen Blick darauf zu werfen! –

+0

Falscher Alarm Ich kann nicht für weitere 30 Minuten oder so posten. Ich versuche, eine Funktion zu bekommen, die meinen Hintergrund bewegt, um bei einer Kollision anzuhalten. bg.run (moveBGForever). Ich habe .removeAllActions versucht, aber das tut es nicht. –

Verwandte Themen