我已经在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
}
}
您至少有四个选项,其中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
}