2016-07-24 45 views
1

我正在製作一個2D側滾動器。SKNode在刪除之前執行動畫

有從右邊產卵的火箭。

當我在一個扔一個彈丸,我希望它:

  • 喜歡它的行爲一直打,也許是小幅的矢量路徑,閃紅,諸如此類的事情
  • 彈丸上移動應該插入火箭,就像一個箭頭(node.position = RocketNode.position一直不幸爲我工作:|)
  • 如果敵人HP是0,執行死亡動畫
  • 死後動畫,刪除火箭和彈丸

下面是我一直在努力工作的代碼,我很困惑哪個節點是哪個節點,以及如何針對兩個不同的節點... bodyA和bodyB執行相同的事情也是相當低效的...

這一切都在didBeginContact功能......我留下了一些評論代碼,疣所有。

case projectileGroup | rocketgroup: 
     if contact.bodyA.categoryBitMask == rocketgroup || contact.bodyB.categoryBitMask == rocketgroup 
     { 



      //projectileObject.physicsBody?.velocity = CGVectorMake(0 , 0) 

      if Model.sharedInstance.sound == true 

      { 
       runAction(RocketExplosionPreload) 
      } 

      Model.sharedInstance.totalscore = Model.sharedInstance.totalscore + Model.sharedInstance.score 


      RocketExplodeTexturesArray = [SKTexture(imageNamed: "RocketExplode0"),SKTexture(imageNamed: "RocketExplode1"),SKTexture(imageNamed: "RocketExplode2"),SKTexture(imageNamed: "RocketExplode3"),SKTexture(imageNamed: "RocketExplode4"),SKTexture(imageNamed: "RocketExplode5"),SKTexture(imageNamed: "RocketExplode6")] 

      let RocketExplodeAnimation = SKAction.animateWithTextures(RocketExplodeTexturesArray, timePerFrame: 0.1) 

      let RocketExp = SKAction.repeatAction(RocketExplodeAnimation, count: 1) 

      print(contact.bodyA.node) 
      print(contact.bodyB.node) 



      if let node = contact.bodyA.node as? SKSpriteNode { 
       print(node) 
       //node.paused = true 
       if node.parent != nil { 


        let moveUp = SKAction.moveToY(0, duration: 1) 

        let fadeOut = RocketExp 



        let remove = SKAction.removeFromParent() 

        let moveAndFade = SKAction.group([moveUp, fadeOut]) 

        let sequence = SKAction.sequence([moveUp,fadeOut]) 




        RocketNode?.runAction(sequence) { 
         /// remove theSprite from it's parent 
         /// Might need to weakly reference self here 
         RocketNode!.removeFromParent() 
         ProjectileNode!.removeFromParent() 
         print("Deleted") 
        } 






        //node.removeFromParent() 
       } 
      } 
      if let node = contact.bodyB.node as? SKSpriteNode { 
       print(node) 
       //node.paused = true 
       if node.parent != nil { 

        let moveUp = SKAction.moveToY(0, duration: 1) 

        let fadeOut = RocketExp 



        let remove = SKAction.removeFromParent() 

        let moveAndFade = SKAction.group([moveUp, fadeOut]) 

        let sequence = SKAction.sequence([moveUp,fadeOut]) 




        RocketNode?.runAction(sequence) { 
         /// remove theSprite from it's parent 
         /// Might need to weakly reference self here 
         RocketNode!.removeFromParent() 
         ProjectileNode!.removeFromParent() 
         print("Deleted") 
        } 
       } 
      } 
     } 
+1

我做了這樣一個遊戲,你必須尋的導彈之類的東西。不過,我真的不明白這個問題是什麼?儘量專注於具體的任務。例如,你可以用動作序列完成你移除火箭和炮彈的部分。具有生命值的部分可以通過這種方式完成,以至於火箭有一種叫做applyDamage(損傷)的方法...... – Whirlwind

回答

1

就像@whirlwind所評論的,你在這裏同時提出了很多問題。 我沒有運行這個代碼,但它應該明確指出你在正確的方向。

class RocketNode: SKSpriteNode 
{ 
    var HP: Int = 10 
    func runHitAnimation() 
    { 
    // flash red or something 
    } 
} 

檢測接觸:

let projectileCategory: UInt32 = 4 // some power of 2 
let rocketCategory: UInt32 = 8 

func didBeginContact(contact: SKPhysicsContact) 
{ 
    let firstBody = contact.bodyA 
    let secondBody = contact.bodyB 

    if (firstBody.categoryBitMask | secondBody.categoryBitMask) == 
    (projectileCategory | rocketCategory) 
    { 
    self.evaluateRocketProjectileContact(between: firstBody, and: secondBody) 
    } 
} 

評估聯繫人:

func evaluateRocketProjectileContact(between firstBody: SKPhysicsBody, and secondBody: SKPhysicsBody) 
{ 
    var rocketBody: SKPhysicsBody 
    var projectileBody: SKPhysicsBody 

    if (firstBody.categoryBitMask & projectileCategory) > 0 
    { 
    projectileBody = firstBody 
    rocketBody = secondBody 
    } 
    else 
    { 
    projectileBody = secondBody 
    rocketBody = firstBody 
    } 

    let rocket = rocketBody.node as! RocketNode 
    let projectile = projectileBody.node as! SKSpriteNode 

    rocket.HP -= 1 

    // move projectile to rocket and remove its physics body 
    projectile.moveToParent(rocket) 
    projectile.physicsBody = nil 

    if rocket.HP == 0 
    { 
    // do something explosive animation 
    let explode = SKAction.scaleBy(2.0, duration: 1.0) 
    rocket.runAction(explode, completion: { 
     rocket.removeFromParent() 
    }) 
    } 
} 
相關問題