How can I make SKAction.move() to be random and repeatForever?
For example:
let boxPosition = Double.random(in: 100…600)
let boxMove = SKAction.move(to: CGPoint(x: boxPosition, y: 100), duration: 10)
let boxRepeat = SKAction.repeatForever(boxMove)
box.run(boxRepeat)
I know that in above example will not update the value…
I have solution that works but doesn't feel right. The sequence won't work...
import SpriteKit
class GameScene: SKScene {
let box = SKSpriteNode()
override func didMove(to view: SKView) {
box.texture = SKTexture(imageNamed: "box")
box.size = CGSize(width: 50, height: 50)
box.position = CGPoint(x: 200, y: 200)
addChild(box)
let boxRandom = SKAction.run({
let boxPosition = Double.random(in: 300...500)
let boxMove = SKAction.move(to: CGPoint(x: 200, y: boxPosition), duration: 2)
self.box.run(boxMove)
})
let boxMove = SKAction.move(to: CGPoint(x: 200, y: 100), duration: 2)
let boxGroup = SKAction.sequence([boxMove, boxRandom])
let boxRepeat = SKAction.repeatForever(boxGroup)
box.run(boxRepeat)
}
}
Any suggestion? Thanks for all the answers in advance.
The
SKAction.runtakes place instantaneously, so it won't wait for the completion of theSKAction.moveinside it.A simple fix for your code would be to add an
SKAction.waitfor the same duration as theSKAction.moveinside the block to the sequence:If you need to use a custom duration for each move action, you could create a method that will run the random move and recursively call the same method when the move completes. Something like this:
Also consider looking at Drive Game Logic for more control over your outcomes.