繁体   English   中英

Spritekit中节点之间一定距离的调用方法

[英]Call method on certain distance between nodes in Spritekit

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

[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有很多节点。 也许最好为敌人创造一个独立的自我事物

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"];
}

这是正确的方法吗?

我认为采用其他方法会更好。

与其计算每次更新时玩家与每个节点之间的距离,不如使用碰撞框架,该框架的计算速度要快得多。

向玩家添加透明颜色的圆形节点(UIColor的alpha 0),该节点的半径为当敌人靠近时想要发生多远的距离。 当敌人与圈子碰撞时,运行您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM