如何为每个生成的SKSpriteNode添加单个整数变量

时间:2019-04-07 00:46:13

标签: swift sprite-kit

我迅速创建了一个小行星类型的游戏,其中我遇到多种类型的敌人。我目前有一个敌人,被一击摧毁。我正在尝试制造第二个被两次击中摧毁的敌人。

我在类级别分配了一个变量“ var missileTwoHealth = 0”,然后在函数中创建了敌人,物理物体,路径等,为此我添加了“ self.enemyTwoHealth = 2”。当导弹与敌人碰撞时,在我的“ didBegin(_ contact:SKPhysicsContact)”内部,我递减“ enemyTwoHealth-= 1”,并检查“ if敌人TwoHealth <= 0 {body2.node?.removeFromParent()}”。

我所遇到的问题是,当第二个敌人在杀死第一个敌人之前在屏幕上产生了两个敌人时,它们的所有生命值再次重置为2。 (例如EnemyType2产生,它具有2点生命值,我击中过一次,现在它具有1点生命值;第二个EnemyType2产生器,现在都具有2点生命值。)

如何为每个敌人分配健康变量?

(有很多代码,所以我尝试只包含相关代码)

class GameScene: SKScene, SKPhysicsContactDelegate {

     var enemyTwoHealth = 0

     func didBegin(_ contact: SKPhysicsContact) {

          if body1.categoryBitMask == PhysicsCategories.Missle && 
          body2.categoryBitMask == PhysicsCategories.EnemyTwo {

               if enemyTwoLives <= 0 {
                    body2.node?.removeFromParent()
                    addScore()
               }
               else {
                    enemyTwoHealth -= 1
               }

               body1.node?.removeFromParent()
          }

      }

     func spawnEnemyTwo() {
          self.enemyTwoLives = 2
     }

}

1 个答案:

答案 0 :(得分:1)

您至少有四个选项,其中两个建议已提出。

由于这是一个小行星游戏,因此我根本不会“健康”,在您的情况下,我要做的是让孩子继承SKSpriteNodes。

您的层次结构应如下所示:

Biggest asteroid - zPosition = 5  
|  
-- Bigger asteroid - zPosition = 4  
|  |  
|  -- Big asteroid - zPosition = 3  
|  |  |  
|  |  -- Small asteroid - zPosition = 2  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  
|  |  -- Small asteroid - zPosition = 2  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  
|  -- Big asteroid - zPosition = 3  
|  |  |  
|  |  -- Small asteroid - zPosition = 2  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  
|  |  -- Small asteroid - zPosition = 2  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  
|  -- Big asteroid - zPosition = 3  
|  |  |  
|  |  -- Small asteroid - zPosition = 2  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  
|  |  -- Small asteroid - zPosition = 2  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  
|  |  |  -- Smaller asteroid - zPosition = 1  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  
|  |  |  |  |  
|  |  |  |  -- Smallest asteroid - zPosition = 0  

所有这些小行星都将位于(0,0)位置,但zPosition最高的节点除外。

然后,当您玩游戏时,当最大的小行星被射击时,您可以采用一种方法,将其直系子代(如非孙子代)带走并从小行星上带到场景中。然后,您可以应用代码,根据子弹的进入方式,使它们朝不同的方向投射。

每次射击小行星时,您都将子代移到场景中并移除父代。

最终,您将陷入没有孩子的最小的小行星,从而摧毁了所有小行星。

此方法在RAM中会有点贵,但是您不必担心会丢失不断创建新对象的CPU周期。

另一件事是您可以将其子类SKSpriteNode赋予每个类。

class Rocks : SKSpriteNode{
    var health = 0
    convenience init(health:Int){
        self.init(imageNamed:"rock")
        self.health = health
    }
}

您还可以做的另一件事是将运行状况添加到userData中:

let userData = rock.userData ?? [:]()
userData["health"] = 2
rock.userData = userData

....

 if let health = rock.userData["health"]{
     health -= 1
     rock.userData["health"] = 1
 }

最后,您可以使用GamePlayKit并添加一个健康组件:

 class HealthComponent : GKComponent{
     var health = 2
 }

 ....
 var healthComponent = new HealthComponent()
 rock.entity.addComponent(healthComponent)

 ....
 if let healthComponent = rock.entity.component(ofType:HealthComponent){
     healthComponent.health -= 1
 }