2017-03-20 42 views
0

我每隔一秒左右從節點的頂部落下節點。 當播放器(在屏幕的底部)與下降節點發生衝突時,我希望將該特定節點從屏幕上移除,但另一個繼續下降。Swift移除碰撞後移動的1個節點

我認爲調用node.removeFromParent()可能會這樣做,或者可能會刪除所有節點,但無論如何都不會發生。

以下是我有:

使得節點下降:

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) 




} 

檢測接:

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()似乎只對我的工作時,有一個節點在屏幕上。再者,它不起作用。

+0

變量'mete'將始終引用最後創建的表面,而不是碰撞中涉及的表面。因此,'removeFromParent'將會起作用,它只會刪除您可能沒有注意到的其他節點。 –

+0

如果您調整了Mete的物理類別「ColliderType.mete」,則可能會發現代碼更清晰。另外,你確定'contactTest'和'collision'位掩碼應該與'category'相同嗎?玩家的類別是什麼? –

回答

1

如果你使用mete,它會引用實際的對象mete,我假設屏幕上有很多metes。嘗試引用物理主體中的實際節點並從父節點中刪除該節點。

更換

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() 

} 

隨着

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

     contact.bodyA.node?.removeFromParent() 

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

的.node,您可以訪問實際的實例中的問題。

祝你好運!

+0

真棒,完美謝謝!我剛剛發佈了另一個小問題,如果你不介意看看! –

+0

假警報我不能張貼另外30分鐘左右。我試圖讓一個函數移動我的背景以停止碰撞。 bg.run(moveBGForever)。我嘗試過.removeAllActions,但這並沒有。 –