复杂的敌人行为和模式

时间:2015-01-29 17:55:32

标签: ios objective-c swift model-view-controller sprite-kit

我想在我的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的子类。

对于这样的情况,理想情况下,我想要一个新的类,如ComplexEnemyEnemyGroup类来处理这个问题,这样我就可以实现更复杂的敌人行为和模式(想想史诗老板)与多个阶段的战斗)。我想这个新课程可能来自SKNode(甚至NSObject?)并在某些点生成多个Enemy个实例。

我在思考正确的道路吗?我有兴趣听听人们用来实现这种行为的方式,最好有几个例子。

-DC

tl; dr - 一群敌人,有多个阶段的老板。你们是怎么做到的?

2 个答案:

答案 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被实例化时,它会在该数组中注册它,以便可以检查它。它会在从内存中删除之前从数组中删除它。