Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

152
Views
How to animate random repeated actions?

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.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

The SKAction.run takes place instantaneously, so it won't wait for the completion of the SKAction.move inside it.

A simple fix for your code would be to add an SKAction.wait for the same duration as the SKAction.move inside the block to the sequence:

let wait = SKAction.wait(forDuration: 2)

let boxGroup = SKAction.sequence([boxMove, boxRandom, wait])

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:

override func didMove(to view: SKView) {
    recursiveRandomMove()
}

func recursiveRandomMove() {
    let random = CGFloat.random(in: 100...400)
    let duration = Double.random(0...10) // your custom duration here
    box.run(SKAction.sequence([
        SKAction.moveTo(x: random, duration: duration),
        SKAction.run {
            self.recursiveRandomMove()
        }
    ]))
}

Also consider looking at Drive Game Logic for more control over your outcomes.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!