2016-01-23 119 views
0

我对Swift很陌生,所以请原谅我,如果这是令人困惑的。Swift 2,SpriteKit,我无法从父项中删除一个节点

我试图让我的一个节点“番石榴”在“忍者”与它相撞时消失。

目前我的代码在我的createScene设立()函数像这样:

 func spawnGuava(){ 

     //The way the Guava spawn and move 

     let guavaNode = SKNode() 

     let guava = SKSpriteNode(texture: guavaNodeTexture) 

     guava.setScale(0.75) 
     guava.position = CGPointMake (self.size.width + 160, self.size.height * 0.05) 
     guava.physicsBody = SKPhysicsBody(rectangleOfSize: guava.size) 
     guava.physicsBody?.affectedByGravity = false 
     guava.physicsBody?.dynamic = true 
     guava.alpha = 0.75 
     guava.physicsBody?.categoryBitMask = PhysicsCatagory.Guava 
     guava.physicsBody?.collisionBitMask = PhysicsCatagory.None 
     guava.physicsBody?.contactTestBitMask = PhysicsCatagory.Ninja 

     guava.zPosition = 0 

     guavaNode.addChild(guava) 


     guava.runAction(GuavaMoveAndRemove) 

     self.addChild(guavaNode) 

     func ninjaAteGuava(ninja: SKSpriteNode, guava: SKSpriteNode){ 

      guavaNode.removeFromParent() 

     } 

     func didCollideWithGuava(contact: SKPhysicsContact){ 
      var firstBody: SKPhysicsBody 
      var secondBody: SKPhysicsBody 

      if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask{ 
       firstBody = contact.bodyA 
       secondBody = contact.bodyB 
      } 
      else{ 
       firstBody = contact.bodyB 
       secondBody = contact.bodyA 
      } 

      if ((firstBody.categoryBitMask & PhysicsCatagory.Guava != 0) && (secondBody.categoryBitMask & PhysicsCatagory.Ninja != 0)) { 
       ninjaAteGuava(firstBody.node as! SKSpriteNode, guava: secondBody.node as! SKSpriteNode) 

      } 
     } 

以下是关于忍者的一些信息

let ninjaTexture = SKTexture(imageNamed:"ninja") 
    ninjaTexture.filteringMode = SKTextureFilteringMode.Nearest 

    ninja = SKSpriteNode(texture: NinjaTexture) 
    ninja.setScale(0.5) 
    ninja.position = CGPoint(x: self.frame.size.width * 0.50, y: self.frame.size.height * 0.6) 

    ninja.physicsBody = SKPhysicsBody(circleOfRadius: ninja.size.height/2) 
    ninja.physicsBody?.categoryBitMask = PhysicsCatagory.Ninja 
    ninja.physicsBody?.collisionBitMask = PhysicsCatagory.Ground | PhysicsCatagory.Wall | 
    ninja.physicsBody?.contactTestBitMask = PhysicsCatagory.Ground | PhysicsCatagory.Wall | PhysicsCatagory.Guava 
    ninja.physicsBody!.dynamic = true 
    ninja.physicsBody!.allowsRotation = false 

    self.addChild(ninja) 

额外的信息:

struct PhysicsCatagory { 

static let None : UInt32 = 0 
static let Boognish : UInt32 = 0x1 << 1 
static let Ground : UInt32 = 0x1 << 2 
static let Wall : UInt32 = 0x1 << 3 
static let Guava : UInt32 = 0x1 << 4 
static let Pepper: UInt32 = 0x1 << 5 

}

+0

您是否已将guavaNode添加到场景中? – Seivan

回答

0

guavaNode应在ninjaAteGuava function

func ninjaAteGuava(ninja: SKSpriteNode, guava: SKSpriteNode){ 

     guavaNode.removeFromParent() 

} 

guava应该是:

func ninjaAteGuava(ninja: SKSpriteNode, guava: SKSpriteNode){ 

     guava.removeFromParent() 

} 

这是因为你在函数参数是番石榴;不是guavaNode。我不知道为什么Xcode不会给你一个错误,但这应该工作。希望这可以帮助。

+0

虽然我同意应该引用块参数,但我认为这可能不是问题。 由于'ninjaAteGuava''已经可以访问范围'''guavaNode''定义在 另一个问题是它不会帮助,因为''''''''''''''''''''''''''因此也删除 '''番石榴'''。 还有一些问题,因为块参数'''guava''被声明了两次。 不知道如何没有警告。 – Seivan

0

您是否已将guavaNode添加到现场或guava? 因为你从现场移除guavaNode,但我怀疑你可能已添加到guava场景内 guava.runAction(GuavaMoveAndRemove)

也许那里的行动,可能会引发你的bug里面别的东西?