2016-07-24 23 views
1

私は2dサイドスクロールを作っています。SKNodeは削除する前にアニメーションを実行します

右からスポーンを起こすロケットがあります。

私は1つの発射をチャックするとき、私はそれをしたい:おそらく、そのベクトルパスにわずかに後方に移動、ヒットされているよう

  • 行為、フラッシュ赤、事
  • のその種発射
  • 敵のHPが0の場合、死のアニメーションを実行します。
  • 死のアニメーションの後に、削除します。ロケットと発射体

以下は、私が作業をしようとしてきたコードです。私はどのノードがどのノードであるのか、どのように2つの異なるノードをターゲットにするのか混乱しています... bodyAとbodyBは同じことを実行することもかなり非効率です...

これはすべてdidBeginContactの機能の中にあります...私はいくつかのコメント付きコードwarts n allを残しました。

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

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

接触を検出します。それでも、私は本当に問題が何かを得ることはありませんか?特定のタスクに集中してみてください。例えば、ロケットと発射体を取り除いた部分は、アクションシーケンスで行うことができます。ヒットポイントを持つ部分は、ロケットにapplyDamage(ダメージ)などのメソッドがあるようにすることができます... – Whirlwind

答えて

1

@whirlwindと同様に、ここでは多くの質問をしています。 私はこのコードを実行していませんが、間違いなく正しい方向を指すはずです。

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() 
    }) 
    } 
} 
関連する問題