Search code examples
swiftbackgroundsprite-kitframeupdates

Infinite Background problem with division SpriteKit


I've been trying to implement an infinite background animation, which should change between 4 images of equal height and then repeat the sequence. However, it does not seem to work properly.

Note anchorPoint = CGPoint(x: 0.5, y: 0)

func updateBackground(currentTime: TimeInterval){
        var delta: CGFloat = 0.0
        if lastUpdate != nil {
            delta = CGFloat(currentTime - lastUpdate)
        }

        //First increment position
        activeBackground1.position.y += delta*backgroundVelocity
        activeBackground2.position.y += delta*backgroundVelocity

        //Detect bounds surpass
        if activeBackground1.position.y > activeBackground1.size.height + screen.height/2 {
            lastSky = (lastSky + 1)%4
            sky1 = SKTexture(imageNamed: "sky" + String(lastSky))
            activeBackground1.texture = sky1
            //Reposition: background1 new position is equal to minus the entire height of
            //background2 + its y size.
            activeBackground1.position.y = -abs(activeBackground2.size.height-activeBackground2.position.y)
        }

        if activeBackground2.position.y > activeBackground2.size.height + screen.height/2 {
            lastSky = (lastSky + 1)%4
            sky1 = SKTexture(imageNamed: "sky" + String(lastSky))
            activeBackground2.texture = sky1
            activeBackground2.position.y = -abs(activeBackground1.size.height-activeBackground1.position.y)
        }
    }

The update algorithm works fine, but when it is needed to reposition one of the two background, it seems there is an offset of about 10.0 CGFloat from one background to another. What am I doing wrong?

EDIT: It turned out that the error was located in my image, which presented some blank rows and therefore generated visualisation glitches. So my code works perfectly.


Solution

  • I do the test and most likely you should use something like:

    activeBackground2.position.y = activeBackground1.size.height + activeBackground1.position.y
    

    instead of

    activeBackground2.position.y = -abs(activeBackground1.size.height-activeBackground1.position.y)
    

    I did this example and it works correctly: https://github.com/Maetschl/SpriteKitExamples/tree/master/InfiniteBackground/InfiniteBackground Feel free to see and use.

    enter image description here