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

问题描述 投票:1回答:1

我已经在swift中创建了一个小行星类型的游戏,我有多种类型的敌人。我目前有一个敌人,一击就被摧毁。我试图创造一个被两次击中摧毁的第二个敌人。

我已经在类级别分配了一个变量“var enemyTwoHealth = 0”,然后在我的函数中我为其创建了敌人,物理实体,路径等,我添加了“self.enemyTwoHealth = 2”。在我的“didBegin(_ contact:SKPhysicsContact)”里面,当导弹与敌人发生碰撞时,我减少了“enemyTwoHealth - = 1”,并检查“如果enemyTwoHealth <= 0 {body2.node?.removeFromParent()}”。

我遇到的问题是,当第二个敌人在杀死第一个敌人之前在屏幕上产生时,它会将所有健康状况再次重置为2。 (例如EnemyType2产生,它有2个生命值,我打了一次,现在它有一个生命值;第二个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
     }

}
swift sprite-kit
1个回答
1
投票

您至少有四个选项,其中2个是评论建议的。

由于这是一个小行星游戏,我根本不会做出“健康”。在你的情况下,我会做的是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  

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

然后,当你的游戏进行游戏时,当你的最大的小行星被射击时,你有一种方法可以带走它的直接孩子(如不是孙子)并将它们从小行星上带到现场。然后,您应用代码,使其根据子弹的进入情况向不同方向投影。

每次射击小行星时,都会将孩子移动到场景中并移除父级。

最终你会得到没有孩子的最小的小行星,从而摧毁了所有的小行星。

这种方法在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
 }
© www.soinside.com 2019 - 2024. All rights reserved.