Ios 只有当精灵在摄像机/播放器的视野内时,才能让SKaction永远重复吗?
这是一个2D游戏: 我有一定的生活质量,这是永恒的,对我来说,两个大的是硬币上下旋转和水流 根据苹果的文档,SKactions是实例。因此,只要我有一个子类的动作,那么它只会运行“一次”,不管有多少精灵使用它。例如,只要我的所有硬币都来自同一个“硬币”类,那么无论我有1个还是20个硬币,硬币的动作所使用的内存足迹都是相同的 尽管如此,当这些动作甚至不在摄像机/播放器的视野内时,让它们继续进行似乎是一种浪费 有没有一种方法可以让不在摄像机视野内的重复动作停用?我知道这违背了“永远”的目的,但据我所知,要么选择某种静态持续时间,要么选择永远Ios 只有当精灵在摄像机/播放器的视野内时,才能让SKaction永远重复吗?,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,这是一个2D游戏: 我有一定的生活质量,这是永恒的,对我来说,两个大的是硬币上下旋转和水流 根据苹果的文档,SKactions是实例。因此,只要我有一个子类的动作,那么它只会运行“一次”,不管有多少精灵使用它。例如,只要我的所有硬币都来自同一个“硬币”类,那么无论我有1个还是20个硬币,硬币的动作所使用的内存足迹都是相同的 尽管如此,当这些动作甚至不在摄像机/播放器的视野内时,让它们继续进行似乎是一种浪费 有没有一种方法可以让不在摄像机视野内的重复动作停用?我知道这违背了“永远”的目的,但据我所
非常感谢您的建议。如果出于任何原因,您的节点不在屏幕上,但需要出现在场景中,那么您应该将其从场景中移除,以帮助提高性能。这将阻止节点上的操作运行,并阻止物理世界检查是否需要在其上放置任何与物理相关的内容
现在有很多方法可以做到这一点,但一个非常基本的原则是建立某种类型的地图来布置节点(这可能是一个未附加到主场景的场景),然后使用地图(场景)跟踪所有节点。拿起相机,找到相机视图中地图(场景)上的所有节点,并将这些节点移到主场景。最好仅在可见时添加节点,但如果节点较少,则可以使用 func containedNodeSet()->Set 示例
class Enemy: SKSprite {
func startAnimationForever() {
//do animation if is not already running
}
func stopAnimation() {//stop animation}
}
在场景中,假设您的摄像机imyCam
:
//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()