这适用于2D游戏:
我有一定的生活质量SKactions永远重复,对我来说两个大的是硬币旋转/上下摆动和水流。
根据Apple的文档,SKactions被实例化。因此,只要我有动作子类,那么它只运行"一次"不管它使用了多少精灵。例如,只要我的所有硬币都从同一个硬币中获取他们的行为"硬币"如果我有1或20个硬币,那么硬币的动作使用的内存占用是相同的。
所有这一切,即使在相机/播放器的情况下也不会让这些行为成为浪费。
当他们不在相机视野时,有没有办法让重复的永久动作停用?我知道这会打败"永远"但据我所知,要么选择某种静态持续时间,要么永远选择。
非常感谢任何建议。
答案 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)然后使用用于跟踪所有节点的地图(场景)。拿起相机,找到相机视图中地图(场景)上的所有节点,然后将这些节点移动到主场景。