我想在我的SpriteKit游戏中与我的敌人稍微改变一下。他们只是......可以预测。我受到了“艾萨克的束缚:重生”中遇到的各种敌人的启发。
例如,让我们说我想在enemy.health < 50.0f
时实施分成两个较小敌人的敌人。在一个简单的场景中,这可以通过迭代我所有的敌人从我的主场景更新循环完成。类似的东西:
if(enemy.health < 50 && enemy.type == kEnemyTypeSplitsIntoTwo) {
CGPoint position1 = CGPointMake(enemy.position.x+20,enemy.position.y);
CGPoint position2 = CGPointMake(enemy.position.x-20,enemy.position.y);
[enemy killEnemy];
[self spawnNewEnemyWithType:enemyType andHealth:50 atPosition:position1];
[self spawnNewEnemyWithType:enemyType andHealth:50 atPosition:position2];
}
这可能适用于简单的情况。但这是我绝对想要避开主场景更新循环的东西。问题是我的敌人类实际上是SKSpriteNode
的子类。
对于这样的情况,理想情况下,我想要一个新的类,如ComplexEnemy
或EnemyGroup
类来处理这个问题,这样我就可以实现更复杂的敌人行为和模式(想想史诗老板)与多个阶段的战斗)。我想这个新课程可能来自SKNode
(甚至NSObject
?)并在某些点生成多个Enemy
个实例。
我在思考正确的道路吗?我有兴趣听听人们用来实现这种行为的方式,最好有几个例子。
-DC
tl; dr - 一群敌人,有多个阶段的老板。你们是怎么做到的?
答案 0 :(得分:2)
使用SKSpriteNode作为敌人类是没有错的。我一直这样做。例如,如果要添加健康栏,则只需将其添加为子项即可。
您的问题主要是基于意见的,因此预计很快就会关闭。然而,这仍是一个很好的问题。我建议你使用一个或多个敌人的SKSpriteNode类来处理你的工作量,因为它可以让初学者更轻松。你当然可以使用一个敌人类,并让其更新方法根据属性处理各个方面。例如:
-(void)update:(NSTimeInterval)currentTime {
if(self.enemyType == kDragon) {
// do big stuff
}
if(self.enemyType == kDwarf) {
// do small stuff
}
}
我目前正在开展一个项目,每个项目有10种不同的敌人和4种行为选项。它都是从一个类(SKSpriteNode)处理的。
这一切都归结为您想要的以及如何安排代码来完成工作。我建议您考虑一下您正在尝试做什么,如果您遇到困难,请就更具体的问题寻求帮助。
答案 1 :(得分:1)
在你的情况下,我会将ComplexEnemy
子类化为一个简单的对象。该对象将负责实例化以及可能出现的各种敌人的场景添加和删除。
然后在你的场景更新方法中,我会在该对象中调用一个检查方法。检查方法将完成其余的繁重工作。您可以将该调用(update方法中的那个)放在一个方法数组中,当ComplexEnemy
被实例化时,它会在该数组中注册它,以便可以检查它。它会在从内存中删除之前从数组中删除它。