我正在寻找一些帮助,以便了解speedToPoint
变量在1
行动时始终为wait
的原因。
这是我写的SKSpriteNode扩展的一部分,用于使鸟飞到预定义矩形中的随机点。 speedToPoint
也会在1到4之间随机化,并用作moveTo
操作的持续时间。但是,我还需要在动作序列中使用TimeInterval
作为我的等待块。
speedToPoint
确实在运行区中被随机化(我已经确认)。如何在序列的下一部分的等待块中使用相同的随机数?
var speedToPoint:TimeInterval = 1
self.run(SKAction.repeatForever(
SKAction.sequence([
SKAction.run{
speedToPoint = TimeInterval(Globals.sharedInstance.randomF(min: 1, max: 4))
var pointX = Globals.sharedInstance.randomF(min: left,max: right)
let pointY = Globals.sharedInstance.randomF(min: top,max:bottom)
while abs(self.position.x.distance(to: pointX)) < 200 {
pointX = Globals.sharedInstance.randomF(min: left,max: right)
}
self.xScale = pointX < self.position.x ? -1 : 1
self.run(SKAction.move(to: CGPoint(x:pointX,y:pointY),duration: speedToPoint))
},
SKAction.wait(forDuration: speedToPoint)])
),withKey: "inFrame")
为了澄清,我真正要做的是让鸟飞到一个点,一旦它到达那一点,飞到另一个点。我仍然把我听到的动作序列包裹起来,以及他们是否真的等待完成继续前进。从我所读到的内容中可以看出,但不适用于任何move
行为。这就是wait
在那里的原因。也许还有另一种方式?
答案 0 :(得分:2)
SKAction
一旦创建,就无法修改,并且意味着可以重复使用,例如。您无法修改持续时间参数,也无法更改其他传递的参数。这意味着如果需要更改,则必须重新创建它。当然,您可以更改现有操作的速度属性,也可以暂停操作,但在修改现有操作时几乎就是这样。
要解决您的问题,您可以执行下一步:
1)创建一个将精灵移动到特定位置的动作
2)一旦完成动作,你就会创建一个新的动作
你可以使用递归这样做(只需复制并粘贴代码以查看它是如何工作的):
import SpriteKit
class GameScene: SKScene, SKPhysicsContactDelegate {
private var bird = SKSpriteNode(color: .purple, size: CGSize(width: 100, height: 100))
override func didMove(to view: SKView) {
addChild(bird)
recursive()
}
func recursive(){
let sequence = SKAction.sequence([
SKAction.move(to: self.randomPoint(inRect: self.frame), duration: TimeInterval(self.random(between: 1, and: 3))),
SKAction.run({[unowned self] in NSLog("Block executed"); self.recursive()})
])
self.bird.run(sequence, withKey: "aKey")
}
func random(between minimum: CGFloat, and maximum: CGFloat) -> CGFloat{
return CGFloat(arc4random()) / CGFloat(UINT32_MAX) * abs(minimum - maximum) + min(minimum, maximum)
}
func randomPoint(inRect rect:CGRect)->CGPoint{
let x = random( between: -rect.size.width / 2.0 , and: rect.origin.x + rect.size.width/2.0)
let y = random(between: -rect.size.height / 2.0 , and: rect.origin.y + rect.size.height/2.0)
return CGPoint(x: x, y: y)
}
}
要停止此操作,请删除与其关联的密钥。