栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Swift中“暂停”游戏

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Swift中“暂停”游戏

我已经解决了这个问题,并希望在下面的结论中分享我的工作时间,以研究/编码。为了更简单地说明问题,我实际上想实现这一目标(不仅仅是简单地使用SpriteKit场景暂停,这很容易):

  1. 在Swift中启动一个或多个计时器
  2. 停止所有计时器(当用户按下暂停时)
  3. 当用户取消暂停时,所有计时器都将重新启动, 此处停止

有人向我提到,因为我正在使用DispatchQueue.main.asyncAfter,所以无法以我想要的方式暂停/停止(可以取消,但我离题了)。毕竟,我正在做asyncAfter。但是要真正使用计时器,您需要使用NSTimer(在Swift3中现在称为Timer)。

经过研究,我发现 实际上不可能 暂停/取消暂停,因此当您想重新启动暂停的计时器时,可以通过创建一个新计时器(每个计时器)来“作弊”。我的结论如下:

  1. 每个计时器启动时,请记录您需要的延迟(我们将访问后者),并记录该计时器 “触发”的时间。因此,例如,如果它在3秒内启动并执行代码,则将时间记录为Date()+ 3秒。我使用以下代码实现了这一点:
//Take the delay you need (delay variable) and add this to the current

time

let calendar = Calendar.current  let YOUR_INITIAL_TIME_CAPTURED = calendar.date(byAdding: .nanosecond,

value: Int(Int64(delay * Double(NSEC_PER_SEC))), to: Date())!

  1. 既然您已经记录了计时器将触发的时间,您就可以等待用户按下Stop键了。完成后,您将使用.invalidate()使每个计时器无效,并立即记录停止的时间。实际上,此时,您还可以完全计算出用户启动时所需的剩余延迟:
//Calculate the remaining delay when you start your timer backlet elapsedTime = YOUR_INITIAL_TIME_CAPTURED.timeIntervalSince(Date)let remainingDelay = YOUR_INITIAL_TIMER_DELAY - elapsedTime
  1. 当用户点击启动时,您可以通过简单地创建新的计时器来再次启动所有计时器,利用上述的余数(remainingDelay)和viola`,您将拥有新的计时器。

现在,因为我有多个计时器,所以我决定需要在AppDelegate(通过服务类访问)中创建一个词典,以保留所有活动计时器。每当计时器结束时,我都会将其从字典中删除。我最终制作了一个特殊的类,该类具有计时器,初始延迟及其启动时间的属性。从技术上讲,我可以使用数组,也可以将timer键放在该类上,但是我离题了。

我创建了自己的addTimer方法,该方法将为每个计时器创建一个唯一的键,然后在计时器的代码完成后,将按以下方式自动删除:

  let timerKey = UUID().uuidStringlet myTimer: Timer = Timer.scheduledTimer(withTimeInterval: delay, repeats: false) { _ in    block()    self.timers.removevalue(forKey: timerKey) }        }

注意:block()只是调用您包装在计时器中的任何块。例如,我做了一些很酷的事情:

addTimer(delay: 4, repeating: true)        { [unowned self] in self.spawnMonster()        }

因此,addTimer将运行self.spawnMonster代码(作为block()),然后在完成后将其从字典中自动删除。

后来我变得更复杂了,做了一些事情,例如保持重复计时器的运行而不是自动删除,但是出于我的目的,这只是很多非常具体的代码,可能会占用太多的回复:)

无论如何,我真的希望这对某人有帮助,并希望回答任何人遇到的任何问题。我花了很多时间!

谢谢!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/387483.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号