只有当精灵在相机/播放器的视野中时,是否可以永久重复SKaction?

时间:2017-07-18 21:17:37

标签: ios swift sprite-kit

这适用于2D游戏:

我有一定的生活质量SKactions永远重复,对我来说两个大的是硬币旋转/上下摆动和水流。

根据Apple的文档,SKactions被实例化。因此,只要我有动作子类,那么它只运行"一次"不管它使用了多少精灵。例如,只要我的所有硬币都从同一个硬币中获取他们的行为"硬币"如果我有1或20个硬币,那么硬币的动作使用的内存占用是相同的。

所有这一切,即使在相机/播放器的情况下也不会让这些行为成为浪费。

当他们不在相机视野时,有没有办法让重复的永久动作停用?我知道这会打败"永远"但据我所知,要么选择某种静态持续时间,要么永远选择。

非常感谢任何建议。

2 个答案:

答案 0 :(得分:2)

最好只在可见时添加节点,但如果节点很少,则可以使用

  

func containsNodeSet() - >设置

示例

class Enemy: SKSprite {
     func startAnimationForever() {
         //do animation if is not already running
     }
     func stopAnimation() {//stop animation}
}

在你的场景中,假设你的摄像头myCam

//add all enemies in this var or search in the scene all enemy
var allEnemies = Set<Enemy>()

func allVisibleEnemy() ->  Set<Enemy>() {
    let allVisibleEnemy = myCam.containedNodeSet().enumerated().flatMap{node in
         if let enemy = node as? Enemy {
             return enemy
          }
    }
    return Set(arrayLiteral: allVisibleEnemy)
}

func allInvisibleEnemy() ->  Set<Enemy>() {
    let allVisibleEnemy = allVisibleEnemy()
    return allEnemies.substract(allVisibleEnemy)
}

override func update() {
      //all your stuff
      let allVisibleEnemy = getVisibleEnemy()
      let allInvisibleEnemy = allInvisibleEnemy()
      allVisibleEnemy.forEach{enemy in
          enemy.startAnimationForever() 
      }
      allInvisibleEnemy.forEach{enemy in
          enemy.stopAnimation() 
      }
}

如有必要,您可以对其进行优化 我没有编译器,可以自由编辑。

答案 1 :(得分:1)

如果出于任何原因,您的屏幕上没有节点需要在场景中进行任何操作,那么您应该将其从场景中移除以帮助提高性能。这将阻止节点上的动作运行,并阻止您的物理世界检查是否需要放置与物理相关的任何内容。

现在有很多方法可以做到这一点,但是一个非常基本的原则是建立某种地图来布置你的节点(这可能是你没有附加到主场景的SKScene)然后使用用于跟踪所有节点的地图(场景)。拿起相机,找到相机视图中地图(场景)上的所有节点,然后将这些节点移动到主场景。