2016-07-24 81 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() 
    }) 
    } 
}