复杂的敌人行为和模式



我想在我的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类)来处理这个问题,这样我就可以实现更复杂的敌人行为和模式(想想具有多个阶段的史诗般的 Boss 战)。我想这个新类可能会派生自SKNode(甚至NSObject?),并在某些点生成多个Enemy实例。

我在想正确的道路吗?我很想听听人们用什么手段来实现这种行为,最好是举几个例子。

-直流

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

使用 SKSpriteNode 作为敌方职业并没有错。我一直这样做。例如,如果您想添加健康条,您可以简单地将其添加为子项。

您的问题主要是基于意见的,因此预计它很快就会关闭。然而,这仍然是一个很好的问题。我建议你使用一个或多个敌对的SKSpriteNode类来处理你的工作量,因为它可以让初学者更容易。当然,你可以只使用一个敌人类,并让其更新方法根据属性处理各个方面。例如:

-(void)update:(NSTimeInterval)currentTime {
    if(self.enemyType == kDragon) {
        // do big stuff
    }
    if(self.enemyType == kDwarf) {
        // do small stuff
    }
}

我目前正在从事一个项目,该项目有 10 种不同类型的敌人和 4 种行为选项。这一切都从一个类(SKSpriteNode)处理。

这一切都归结为您想要什么以及如何安排代码来完成工作。我建议你考虑一下你想做什么,如果你遇到困难,请就更具体的问题寻求帮助。

在您的情况下,我会将ComplexEnemy子类为一个简单的对象。该对象将负责实例化以及添加和删除可能出现的各种敌人的场景。

然后在场景更新方法中,我将在该对象中调用检查方法。检查方法将完成其余的繁重工作。您可以将该调用(update 方法中的调用)放在方法数组中,当ComplexEnemy实例化时,它会在该数组中注册自身,以便可以对其进行检查。它会在从内存中删除之前将自身从数组中删除。

最新更新