Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 只有当精灵在摄像机/播放器的视野内时,才能让SKaction永远重复吗?_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios 只有当精灵在摄像机/播放器的视野内时,才能让SKaction永远重复吗?

Ios 只有当精灵在摄像机/播放器的视野内时,才能让SKaction永远重复吗?,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,这是一个2D游戏: 我有一定的生活质量,这是永恒的,对我来说,两个大的是硬币上下旋转和水流 根据苹果的文档,SKactions是实例。因此,只要我有一个子类的动作,那么它只会运行“一次”,不管有多少精灵使用它。例如,只要我的所有硬币都来自同一个“硬币”类,那么无论我有1个还是20个硬币,硬币的动作所使用的内存足迹都是相同的 尽管如此,当这些动作甚至不在摄像机/播放器的视野内时,让它们继续进行似乎是一种浪费 有没有一种方法可以让不在摄像机视野内的重复动作停用?我知道这违背了“永远”的目的,但据我所

这是一个2D游戏:

我有一定的生活质量,这是永恒的,对我来说,两个大的是硬币上下旋转和水流

根据苹果的文档,SKactions是实例。因此,只要我有一个子类的动作,那么它只会运行“一次”,不管有多少精灵使用它。例如,只要我的所有硬币都来自同一个“硬币”类,那么无论我有1个还是20个硬币,硬币的动作所使用的内存足迹都是相同的

尽管如此,当这些动作甚至不在摄像机/播放器的视野内时,让它们继续进行似乎是一种浪费

有没有一种方法可以让不在摄像机视野内的重复动作停用?我知道这违背了“永远”的目的,但据我所知,要么选择某种静态持续时间,要么选择永远


非常感谢您的建议。

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


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

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

func containedNodeSet()->Set

示例

class Enemy: SKSprite {
     func startAnimationForever() {
         //do animation if is not already running
     }
     func stopAnimation() {//stop animation}
}
在场景中,假设您的摄像机i
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() 
      }
}
//在此变量中添加所有敌人或在场景中搜索所有敌人
var allEnemies=Set()
func allVisibleForeign()->Set(){
让AllVisibleForeign=myCam.containedNodeSet().enumerated().flatMap{node in
如果让敌人=节点为?敌人{
还敌
}
}
返回集(阵列并行:AllVisibleForeign)
}
func ALINVISIBLEQUERY()->Set(){
让AllVisible敌军=AllVisible敌军()
返回allEnemies.substract(所有可见敌人)
}
覆盖函数更新(){
//你所有的东西
让AllVisible敌军=GetVisible敌军()
让AllinVisible仇敌=AllinVisible仇敌()
所有可见的敌人。所有敌人
敌人。startAnimationForever()
}
所有可见敌人。所有敌人在
敌人
}
}
如有必要,您可以对其进行优化
我没有找到编译器,可以自由编辑。

我想你不明白文档在说什么。SKActions是不可变的,所以当您创建SKAction时,您可以在多个精灵上重用它,而不必担心精灵会更改它。该功能仍然在每个硬币上“运行”,但您不需要每个硬币都有一个实例。与往常一样,尽管KoDs的建议可能是理想的,但我可能有一种更简单(似乎)但效率更低的方法来做事情。我认为应该保留一个字典/集合/节点数组,其中包含繁重的动画,然后每一帧检查这些节点是否在相机的边界内。。如果是,请恢复动画,如果不是,请暂停动画。我猜这将有助于提高性能,但需要对其进行测试。此外,不相关的,
swift3
标记用于提问,与从swift2到swift3的过渡直接相关,依此类推。。。一般的
swift
标签是你应该使用的(而且它有更多的追随者)。我很难描绘关于让相机找到节点并将其移动到主场景的部分。你的屏幕外场景是屏幕上场景的副本,除了它包含所有节点之外。因为它在屏幕外,所以不会在主线程上处理,它只是一个内存保持器。所以你的相机在屏幕上的场景中,把它放在屏幕外的场景中,找出哪些节点属于你的屏幕上的场景,所有其他节点从你的屏幕上的场景中移除,除非它们需要在那里,这个概念叫什么,这样我就可以在它上面查找教程?…我不知道它是否有名字,你只是在屏幕外记录你的场景,并在屏幕上使用你需要的东西。我知道这听起来很容易,但对我来说,我不知道从哪里开始这样的事情。你每次更新都要重新启动动画,你可能需要检查它是否不可用running@Knight0fDragon真的!此开关可放入
func startAnimationForever()