Swift SpriteKit SKSpriteNode

Swift SpriteKit SKSpriteNode,swift,variables,sprite-kit,Swift,Variables,Sprite Kit,当调用此函数时,我试图回击僵尸。唯一的问题是,在某些时间点上,场景中有多个僵尸,而脉冲仅应用于在屏幕上其他僵尸之前产生的僵尸。我怎样才能让所有的僵尸都受到影响?我认为这与行有关,如果让zombieGreen=self.childNodewithName:zombieas?SKSpriteNode 当你把僵尸添加到场景中时,你应该考虑使用数组来存储僵尸。这比枚举场景更快,并为您提供更大的灵活性 func repulseFire() { if let zombieGreen = self.chil

当调用此函数时,我试图回击僵尸。唯一的问题是,在某些时间点上,场景中有多个僵尸,而脉冲仅应用于在屏幕上其他僵尸之前产生的僵尸。我怎样才能让所有的僵尸都受到影响?我认为这与行有关,如果让zombieGreen=self.childNodewithName:zombieas?SKSpriteNode

当你把僵尸添加到场景中时,你应该考虑使用数组来存储僵尸。这比枚举场景更快,并为您提供更大的灵活性

func repulseFire() {
if let zombieGreen =  self.childNode(withName: "zombie") as? SKSpriteNode {
    self.enumerateChildNodes(withName: "repulse") {
        node, stop in
        if let repulse = node as? SKSpriteNode {
        if let action = zombieGreen.action(forKey: "zombieAction") {
                action.speed = 0
                func run() {
                    action.speed = 1
                }
                var dx = CGFloat(zombieGreen.position.x - repulse.position.x)
                var dy = CGFloat(zombieGreen.position.y - repulse.position.y)
                let magnitude = sqrt(dx * dx + dy * dy)
                dx /= magnitude
                dy /= magnitude
                let vector = CGVector(dx: 25.0 * dx, dy: 25.0 * dy)
                func applyImpulse() {
                zombieGreen.physicsBody?.applyImpulse(vector)
                }
                zombieGreen.run(SKAction.sequence([SKAction.run(applyImpulse), SKAction.wait(forDuration: 0.2), SKAction.run(run)]))
            }

            }
        }
    }
}
受场景中所有排斥节点影响的所有僵尸

场景中受一个排斥节点影响的所有僵尸


你列举了一个错误的人。这个“排斥”节点是什么?此外,您将只拾取第一个“僵尸”节点-这是您想要的吗?您不需要另一个enumerateChidNode循环来拾取所有僵尸吗?这比枚举场景更快-很有趣。你是怎么发现的?。要快多少?嗯。如果枚举场景,则将通过场景中的所有节点循环。包括树木、建筑物、云或任何你的场景组成部分。由于我们只寻找僵尸,所以只有僵尸的数组将排除场景中的所有其他内容。对于一个简单的场景,这可能不是一个真正的问题。但是,当场景中有很多东西时,它会产生影响@Steveives,所以产生影响纯粹是猜测?所以你有你的僵尸阵列-当你想处理所有的“攻击僵尸”时会发生什么?你有其他的数组吗?然后在玩家1/4屏幕宽度内的所有僵尸?我认为这是一个过早优化的例子。这正是为什么你应该把僵尸放在一个数组中。如果你想做很多事情,比如检查塔到僵尸的距离,在所有僵尸上运行一些函数,等等。然后你从僵尸数组中访问僵尸,而不是在整个场景中循环所有元素。好的,我明白你的意思。我做了一些性能测试。将200个僵尸节点和200个无关节点添加到场景中。只有僵尸节点被放入一个数组中。使用enumratChildNodes循环场景会使CPU使用率达到7%。循环数组可获得1%的使用率。循环每一帧。如果这真的有什么不同,那就取决于游戏的其他部分。假设50个塔楼和150个瓷砖的瓷砖贴图不确定它是否算作单独的节点,但是。。然后在每次更新中运行枚举两次。14%对2%可能会有所不同。
// create an array of spriteNodes
    var zombieArray:[SKSpriteNode]

    //add zombies to array when you add them to scene
    zombieArray.append(zombieGreen)

    //check if any zombies are in the scene
    if zombieArray.count > 0{
        .....
    }

    //Do something with all the zombies in the array - your main question.
    for zombie in zombieArray{

        .....
        zombie.physicsBody?.applyImpulse(vector)
    }

    // remove zombie from array
    zombieArray.remove(at: zombieArray.index(of: theZombieYouWantToRemove))
func repulseFire() {
    self.enumerateChildNodes(withName: "zombie") {
            zombieGreen, stop in {

            self.enumerateChildNodes(withName: "repulse") {
                node, stop in
                //etc
func repulseFire() {
    self.enumerateChildNodes(withName: "zombie") {
            node, stop in {
        if let repulseNode =  self.childNode(withName: "repulse") {
            //etc