2016-10-10 97 views
1

我在SpriteKit中建立了一个游戏,玩家试图避免与对象发生碰撞。对象正在创建每3至5秒,我试图找出一种方法从父母一旦与屏幕底部碰撞,但由于某种原因,它发生在游戏时它发生请从下面的代码中查看代码。如何在SpriteKit中离开场景后删除SKNode

import SpriteKit 

class PlayScene: SKScene, SKPhysicsContactDelegate { 

enum ColliderType: UInt32 { 

    case none = 0 
    case player1 = 1 
    case object = 2 
    case border = 4 
    case remove = 8 
} 

gameOver = false 

let ground = SKNode() 
    ground.position = CGPoint(x: 0, y: 0) 
    ground.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.frame.size.width + 500, height: 1)) 
    ground.physicsBody?.isDynamic = false 

    ground.physicsBody?.categoryBitMask = ColliderType.remove.rawValue 
    ground.physicsBody?.contactTestBitMask = ColliderType.object.rawValue 
    ground.physicsBody?.collisionBitMask = ColliderType.none.rawValue 

character1.physicsBody!.categoryBitMask = ColliderType.player1.rawValue 
    character1.physicsBody!.contactTestBitMask = ColliderType.object.rawValue 
    character1.physicsBody!.collisionBitMask = ColliderType.object.rawValue | ColliderType.border.rawValue 

object1.physicsBody!.categoryBitMask = ColliderType.object.rawValue 
     object1.physicsBody!.contactTestBitMask = ColliderType.player1.rawValue | ColliderType.remove.rawValue 
     object1.physicsBody!.collisionBitMask = ColliderType.player1.rawValue | ColliderType.border.rawValue | ColliderType.object.rawValue 

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

gameOver == true 
} 

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


      object1.removeFromParent() 
// it runs this code as well as code above collision object with object but i want contact remove with object 
} 

回答

1

试着在未来发布您的完整代码,而不是将一些随机比特放在一起。

你的碰撞代码没有多大意义。它应该看起来更像是这个,你检查,如果播放器 - >对象和对象 - >删除或反之亦然

func didBegin(_ contact: SKPhysicsContact) { 

    let firstBody: SKPhysicsBody 
    let secondBody: SKPhysicsBody 

    // This way you only need to do 1 if statement for each collision. 
    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 


    // Player hit Object or Object hit Player 
    if (firstBody.categoryBitMask == ColliderType.player.rawValue) && (secondBody.categoryBitMask == ColliderType.object.rawValue) { 

     gameOver == true 
    } 

    // Object hit Remove or Remove hit Object 
    if (firstBody.categoryBitMask == ColliderType.object.rawValue) && (secondBody.categoryBitMask == ColliderType.remove.rawValue) { 

     // Remove object 
     firstBody.node?.removeFromParent() 
    } 
} 

我建议你阅读精灵套件碰撞更多一些教程,有很多可用的,如果这是令人困惑给你。

希望这会有帮助