Как добавить отдельные целочисленные переменные для каждого порожденного SKSpriteNode - PullRequest
1 голос
/ 07 апреля 2019

Я быстро создал игру типа астероидов, в которой у меня несколько типов врагов.В настоящее время у меня есть один враг, который уничтожен одним ударом.Я пытаюсь создать второго врага, который будет уничтожен двумя ударами.

Я назначил переменную "var врагиTwoHealth = 0" на уровне класса, затем внутри своей функции, где я создаю врага, физическое тело, пути и т. Д., Для него я добавил "self.enemyTwoHealth = 2".Внутри моего "didBegin (_ contact: SKPhysicsContact)", когда ракета сталкивается с врагом, я уменьшаю значение "templeTwoHealth - = 1" и проверяю, "в случае врага нету <<0 {body2.node? .RemoveFromParent ()}".</p>

Проблема, с которой я столкнулся, заключается в том, что когда у второго врага появляется два экрана, прежде чем убить первого, все его здоровье сбрасывается до 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
     }

}

1 Ответ

1 голос
/ 08 апреля 2019

У вас есть как минимум четыре варианта, 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  

Все эти астероиды будут в положении (0,0), за исключением узла в самой высокой позиции z.

Затем, во время вашей игры, когда стреляют в ваш самый большой астероид, у вас есть метод, который берет своих непосредственных детей (как у не внуков) и убирает их с астероида на сцену. Затем вы применяете свой код, который заставляет их проецироваться в разных направлениях в зависимости от того, как попала пуля.

Каждый раз, когда снимается астероид, вы перемещаете детей на сцену и убираете родителя.

В конце концов вы попадете на самый крошечный астероид, у которого нет детей, тем самым уничтожив весь астероид.

Этот метод будет немного дороже в оперативной памяти, но вам не нужно беспокоиться о потере циклов ЦП, постоянно создающих новые объекты.

Еще одна вещь, которую вы могли бы сделать это подкласс SKSpriteNode, чтобы дать каждому классу.

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

Еще одна вещь, которую вы можете сделать, это добавить здоровье к данным пользователя:

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
 }
...