草庐IT

ios - 只有当 Sprite 在摄像机/播放器的视野中时,是否有可能永远重复 SKaction ?

coder 2023-09-14 原文

这是一个 2D 游戏:

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

根据 Apple 的文档,SKactions 是实例化的。因此,只要我将 Action 子类化,那么它只会运行“一次”,而不管它被使用了多少 Sprite 。例如,只要我的所有硬币都从同一个“硬币”类获取它们的操作,那么无论我有 1 个还是 20 个硬币,硬币操作所使用的内存占用都是相同的。

综上所述,在摄像机/播放器不可见的情况下进行这些操作似乎是一种浪费。

有没有一种方法可以让永远重复的 Action 在相机不可见时停用?我知道这违背了“永远”的目的,但据我所知,它要么选择某种静态持续时间,要么选择永远。

非常感谢任何建议。

最佳答案

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

func containedNodeSet() -> Set

示例

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() 
      }
}

如有必要,您可以对其进行优化 我不会编译器,可以随意编辑。

关于ios - 只有当 Sprite 在摄像机/播放器的视野中时,是否有可能永远重复 SKaction ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45177273/

有关ios - 只有当 Sprite 在摄像机/播放器的视野中时,是否有可能永远重复 SKaction ?的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  3. ruby - 通过 RVM 安装 Ruby 1.9.2 永远行不通! - 2

    当我执行>rvminstall1.9.2时一切顺利。然后我做>rvmuse1.9.2也很顺利。但是当涉及到ruby​​-v时..sam@sjones:~$rvminstall1.9.2/home/sam/.rvm/rubies/ruby-1.9.2-p136,thismaytakeawhiledependingonyourcpu(s)...ruby-1.9.2-p136-#fetchingruby-1.9.2-p136-#downloadingruby-1.9.2-p136,thismaytakeawhiledependingonyourconnection...%Total%Rece

  4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  5. ruby - 当 attr_accessor 在类方法中时会发生什么? - 2

    所以我想到了这个,想知道当下面的一些事情完成后会发生什么。classTestdefself.abcattr_accessor:Johnendendobject=Test.newputs"beforecallingclassmethodabc:#{object.class.instance_methods(false)}"Test.abcputs"aftercallingclassmethodabc:#{object.class.instance_methods(false)}"这里我检查的是,getter和setter方法是否以这种方式创建。如果是这样,是那些实例方法或类方法。首先我创

  6. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  7. ruby-on-rails - 只有当不是 nil 时才执行映射? - 2

    如果names为nil,则以下中断。我怎样才能让这个map只有在它不是nil时才执行?self.topics=names.split(",").mapdo|n|Topic.where(name:n.strip).first_or_create!end 最佳答案 其他几个选项:选项1(在其上执行map时检查split的结果):names_list=names.try(:split,",")self.topics=names_list.mapdo|n|Topic.where(name:n.strip).first_or_create!e

  8. ruby - 正则表达式 - 保存重复捕获的组 - 2

    这就是我做的a="%span.rockets#diamonds.ribbons.forever"a=a.match(/(^\%\w+)([\.|\#]\w+)+/)putsa.inspect这是我得到的#这就是我想要的#帮助?我尝试过但失败了:( 最佳答案 通常,您不能获得任意数量的捕获组,但如果您使用扫描,您可以为您想要捕获的每个标记获得一个匹配:a="%span.rockets#diamonds.ribbons.forever"a=a.scan(/^%\w+|\G[.|#]\w+/)putsa.inspect["%span","

  9. Ruby 从数组中删除重复的对象 - 2

    我无法使用传统的Ruby方法从下面的数组user_list中删除所有重复对象,从而获得预期的结果。有解决这个问题的聪明方法吗?users=[]user_list.eachdo|u|user=User.find_by_id(u.user_id)users 最佳答案 这个怎么样?users=User.find(user_list.map(&:user_id).uniq)这具有作为一个数据库调用而不是user_list.size数据库调用的额外好处。 关于Ruby从数组中删除重复的对象,我们在

  10. Ruby 删除可枚举列表中的重复项 - 2

    ruby中有没有一个很好的方法来删除可枚举列表中的重复项(即拒绝等) 最佳答案 对于数组你可以使用uniq()方法a=["a","a","b","b","c"]a.uniq#=>["a","b","c"]所以如果你只是(1..10).to_a.uniq或%w{antbatcatant}.to_a.uniq因为无论如何,几乎所有您实现的方法都将作为Array类返回。 关于Ruby删除可枚举列表中的重复项,我们在StackOverflow上找到一个类似的问题: h

随机推荐