在Spritekit中节点之间的某个距离上调用方法

时间:2015-11-17 10:14:39

标签: ios objective-c sprite-kit

我正在尝试创造一个敌人跟随玩家的游戏。我尝试枚举所有敌人节点并计算到玩家的距离。我在Update函数中做了所有这些。通过这样做,我有一个巨大的FPS下降和几乎100%的CPU使用率。有没有其他方法可以实现相同的行为?

[self enumerateChildNodesWithName:@"enemy" usingBlock:^(SKNode * _Nonnull node, BOOL * _Nonnull stop) {
    if(SDistanceBetweenPoints(self.player.position, node.position)<120)
        {
            if((![[node.userData objectForKey:@"move"] boolValue])&&
              ((SDistanceBetweenPoints(self.player.position, node.position)>45)))
            {
                [self findPathFor:node To:self.player.position];
            }
            else if (round(SDistanceBetweenPoints(self.player.position, node.position) <= 32.01) &&
                    (![node hasActions]) &&
                    (![[self.player.userData objectForKey:@"move"] boolValue]))
            {
                [self thisNode:node attack:self.player];
            }

            [self update:node WithDeltaTime:deltaTime];
        }
}];

编辑:当我从self枚举敌人时,可能需要花费很多时间,因为self中有很多很多节点。也许为敌人创建一个单独的 self thingy 会更好吗?

EDIT2 :我尝试将所有敌人添加到数组并用于循环而不是枚举。现在我稳定地获得60 fps和±40%的CPU使用率。

for (SKNode *node in self.enemiesArray) {
    [self update:node WithDeltaTime:deltaTime];
}

SKAction *enemiesFollow = [SKAction runBlock:^{

    for(SKNode *node in self.enemiesArray){
       [...]
    }

}];

SKAction *wait = [SKAction waitForDuration:0.5];

if(![self actionForKey:@"enemyFollow"]){
    [self runAction:[SKAction sequence:@[wait, enemiesFollow]] withKey:@"enemyFollow"];
}

这是正确的做法吗?

1 个答案:

答案 0 :(得分:0)

我认为一种不同的方法会更好地为你服务。

不是计算每次更新时播放器与每个节点之间的距离,而是使用冲突帧工作,这应该更快地计算。

添加一个透明色的圆形节点(带有alpha 0的UIColor)给玩家,该玩家的半径是你想要在敌人接近时发生某事的距离。当敌人与圆圈发生碰撞时,运行你的代码。