Бесконечная фоновая проблема с делением SpriteKit - PullRequest
0 голосов
/ 30 марта 2020

Я пытался реализовать бесконечную фоновую анимацию, которая должна переключаться между 4 изображениями одинаковой высоты, а затем повторять последовательность. Однако, похоже, что он не работает должным образом.

Примечание 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)
        }
    }

Алгоритм обновления работает нормально, но когда необходимо изменить положение одного из двух фонов, кажется, есть смещение около 10.0 CGFloat от одного фона к другому. Что я делаю не так?

РЕДАКТИРОВАТЬ: оказалось, что ошибка была обнаружена в моем изображении, который представил несколько пустых строк и, следовательно, сгенерировал глюки визуализации. Так что мой код работает отлично.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Ваша проблема - математика с плавающей точкой, вызывающая ошибки округления. Сейчас я разговариваю по телефону, поэтому не могу написать код, но вам нужно иметь 1 родительский SKNode для обработки всего вашего фона.

Добавьте фоновые ленты в родительский узел. Затем вы помещаете движущееся действие только на родителя.

Когда каждый осколок покидает экран, вы берете осколок и перемещаете его до конца других осколков.

Этот прыжок должен всегда быть сделано с целочисленной математикой, не оставляя дыр.

В основном: движущаяся математика с плавающей запятой выполняется на родительском узле.

Целочисленный прыжок плитки выполняется на каждой из лент.

1 голос
/ 31 марта 2020

Я делаю тест, и, скорее всего, вы должны использовать что-то вроде:

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

вместо

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

Я сделал этот пример, и он работает правильно: https://github.com/Maetschl/SpriteKitExamples/tree/master/InfiniteBackground/InfiniteBackground Не стесняйтесь видеть и использовать.

enter image description here

...