我迅速创建了一个小行星类型的游戏,其中我遇到多种类型的敌人。我目前有一个敌人,被一击摧毁。我正在尝试制造第二个被两次击中摧毁的敌人。
我在类级别分配了一个变量“ 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
}
}
答案 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
}