sprite-kit - 动作不会等到函数调用结束
问题描述
我有 2 个动作按顺序排列。在第一个动作中,我调用了一个方法来计算下一个动作的新等待时间。下一个动作只是等待此持续时间,但第二个动作总是立即执行,因此时间必须为 0。我对其进行了调试,在 spawnFlowers 方法中,我得到的时间返回为 3.5 秒。
这是我的两个动作
let spawnFlowerAction = SKAction.run {
self.WaitTime = self.calculateWaitingTime()
}
let waitForNewFlower = SKAction.wait(forDuration: self.WaitTime)
我这样执行它:
let spawnSeq = SKAction.sequence([spawnFlowerAction, waitForNewFlower])
let spawnRepeat = SKAction.repeat(spawnSeq, count: 4)
self.run(spawnRepeat)
结果:无需等待就产生了 4 次,从 calculateWaitingTime 函数在控制台中打印了 4 个不同的计算时间(其中发生了产生)
什么是解决这个问题的好方法?
解决方案
问题是尝试在创建操作后动态更改 SKActions 中使用的值。例如,当您的WaitTime
变量在运行时发生更改时spawnFlowerAction
,waitForNewFlower
Action 的等待时间不会动态更改,因为它没有引用WaitTime
. 相反,它的等待值是WaitTime
您声明时的变量let waitForNewFlower = SKAction.wait(forDuration: self.WaitTime)
(我猜最初是 0)。同样的概念也适用于您的其他两个生成操作。
我通常将调度队列用于此类事情,但要使用 SKActions 这里有一个函数。只需调用一次并输入您希望它重复的次数。
func spawnRepeat(count: Int) {
//Put whatever code to spawn flower here
print("SPAWN FLOWER")
if count > 1 {
//Recalculate WaitTime
WaitTime = calculateWaitingTime()
let waitAction = SKAction.wait(forDuration: WaitTime)
run(waitAction, completion: { self.spawnRepeat(count: count - 1) })
}
}
推荐阅读
- ios - 如何确保 UILabel 只占用它需要的空间,而不需要额外的填充?
- vue.js - 从 Vue 组件到烧瓶的 WebSockets - 无法连接到服务器
- java - 如何在 Android Studio 中查看 res/drawable-nodpi/ 文件夹
- android - onMessageReceived 未在 buld 变体版本中调用
- asp.net - 如何将gridview中的boundfield值和模板字段值插入数据库
- spring - SpringBatch 写入不同的实体
- html - 如何生成多个头像?
- python - 瓶子:如何在 python 装饰器中设置 cookie?
- session - 终止后重新初始化 Google Analytics 会话(电子商务结帐流程中断)
- c++ - 将项目插入链表时无限循环