草庐IT

ios - SpriteKit 增加移动速度

coder 2023-09-10 原文

我有一个简单的游戏,两条线从屏幕的顶部移动到底部。这两条线之间有一个固定的空间,球必须穿过该空间,否则游戏就结束了。

我对游戏的基础没有问题,我可以添加两条线,每次都有不同位置的空间,但我也想提高线的移动速度。我尝试使用计时器并增加 SKAction.move 的 TimeInterval,但由于稍后添加的行更快,行之间的水平空间变小,这是我不希望发生的。

这是添加两行并将它们移动到屏幕底部的函数。

func addLines() {

    let lineNodeFirst = SKSpriteNode(color: .red, size: CGSize(width: random(min: 100, max: 400), height: 10.0))
    lineNodeFirst.position = CGPoint(x: -size.width / 2, y: 0 + size.height / 2 + 100)
    lineNodeFirst.anchorPoint = CGPoint.zero

    let actionMove = SKAction.move(to: CGPoint(x: lineNodeFirst.position.x, y: 0 - size.height / 2), duration: TimeInterval(2.3))
    let actionMoveDone = SKAction.removeFromParent()

    lineNodeFirst.run(SKAction.sequence([actionMove, actionMoveDone]))

    let centerPoint = CGPoint(x: lineNodeFirst.size.width / 2 - (lineNodeFirst.size.width * lineNodeFirst.anchorPoint.x), y: lineNodeFirst.size.height / 2 - (lineNodeFirst.size.height * lineNodeFirst.anchorPoint.y))
    lineNodeFirst.physicsBody = SKPhysicsBody(rectangleOf: lineNodeFirst.size, center: centerPoint)

    lineNodeFirst.physicsBody?.isDynamic = true
    lineNodeFirst.physicsBody?.categoryBitMask = 2
    lineNodeFirst.physicsBody?.contactTestBitMask = 1
    lineNodeFirst.physicsBody?.collisionBitMask = 0

    self.addChild(lineNodeFirst)

    let spaceBetweenNodes: CGFloat = 150
    let lineNodeSecondWidth: CGFloat = size.width - lineNodeFirst.size.width - spaceBetweenNodes

    let lineNodeSecond = SKSpriteNode(color: .red, size: CGSize(width: lineNodeSecondWidth, height: 10.0))
    lineNodeSecond.anchorPoint = CGPoint.zero
    let lineNodeSecondX = lineNodeFirst.position.x + lineNodeFirst.size.width + spaceBetweenNodes
    lineNodeSecond.position = CGPoint(x: lineNodeSecondX, y: lineNodeFirst.position.y)

    let actionMoveSecond = SKAction.move(to: CGPoint(x: lineNodeSecond.position.x, y: 0 - size.height / 2), duration: TimeInterval(2.3))

    lineNodeSecond.run(SKAction.sequence([actionMoveSecond, actionMoveDone]))

    let centerPointSecond = CGPoint(x: lineNodeSecond.size.width / 2 - (lineNodeSecond.size.width * lineNodeSecond.anchorPoint.x), y: lineNodeSecond.size.height / 2 - (lineNodeSecond.size.height * lineNodeSecond.anchorPoint.y))
    lineNodeSecond.physicsBody = SKPhysicsBody(rectangleOf: lineNodeSecond.size, center: centerPointSecond)

    lineNodeSecond.physicsBody?.isDynamic = true
    lineNodeSecond.physicsBody?.categoryBitMask = 2
    lineNodeSecond.physicsBody?.contactTestBitMask = 1
    lineNodeSecond.physicsBody?.collisionBitMask = 0

    self.addChild(lineNodeSecond)

}

我分享了一个具有基础知识的应用程序演示。有什么提高线移动速度的建议吗?

Demo Video

最佳答案

我想不出一种在不提高所有线路速度的情况下加快线路速度的方法。如果不提高所有行的速度,您将遇到行间间隙缩小的问题,否则您将不得不横穿屏幕上的所有行并同时重写它们的 Action 。

您可以做的可能相当容易的事情是创建 2 个较大的面板,这些面板从上到下滚动场景,并在滚动到底部的页面时重置,从而创建各种滚动背景。然后将您的酒吧应用于这些面板。您现在将看到条形图在屏幕上向下移动的效果。当您想提高游戏的播放速度时,您只需提高 2 个面板上的速度即可。

在我的演示图像中,我添加了多种颜色只是为了向您展示面板之间的间隔。但是如果这些背景颜色被移除,你甚至不会意识到移动的是面板而不是条形条 ;)

作为额外的好处,您可以将面板创建为一个类,将条形图创建为一个类,然后将条形图分配给面板。当需要将面板重置到顶部时,您只需将条形的 2 个内部开口点调整到新的间隙即可。这样您就不会即时动态地创建这些条。

关于ios - SpriteKit 增加移动速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46195834/

有关ios - SpriteKit 增加移动速度的更多相关文章

  1. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  2. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  3. 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返回它复制的字节数,但是当我还没有下

  4. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

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

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

  6. 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使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  8. 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上

  9. java - Ruby 和 Java 的速度 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。在我在网上找到的每个基准测试中,Ruby似乎都很慢,比Java慢得多。Ruby的人只是说这无关紧要。您能举个例子说明RubyonRails(以及Ruby本身)的速度真的无关紧要吗?

  10. ruby - 为 IO::popen 拯救 "command not found" - 2

    当我将IO::popen与不存在的命令一起使用时,我在屏幕上打印了一条错误消息:irb>IO.popen"fakefake"#=>#irb>(irb):1:commandnotfound:fakefake有什么方法可以捕获此错误,以便我可以在脚本中进行检查? 最佳答案 是:升级到ruby​​1.9。如果您在1.9中运行它,则会引发Errno::ENOENT,您将能够拯救它。(编辑)这是在1.8中的一种hackish方式:error=IO.pipe$stderr.reopenerror[1]pipe=IO.popen'qwe'#

随机推荐