Как определить конкретные узлы в представлении SKCamera? - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь переработать тот же SKSpriteNode, чтобы сделать непрерывный фон. Я создал SKSpriteNode как bg0, bg1, bg2 и правильно разместил их при представлении сцены. Каким-то образом, ниже код ТОЛЬКО переустанавливает bg0 один раз.

cam равно SKCameraNode, поэтому я проверяю, содержит ли камера узлы фона. Из-за их размера, всегда один из них не должен быть виден в окне просмотра камеры. Однако, как я сказал, это работает только один раз, и когда камера показывает переработанный bg0 не распознает его.

Заранее спасибо.

PS: я уже пробовал cam.intersects(bg0), получил тот же результат.

func updateBgPos() {
    if (player?.position.y)! > self.frame.height {
        if !cam.contains(bg0!) {
            print("bg0 is not in the scene")
            newPosBgY = (bg2?.position.y)! + self.frame.height
            bg0?.physicsBody = nil
            bg0?.position = CGPoint(x: self.frame.width / 2, y: newPosBgY)
            bg0?.physicsBody = bg1?.physicsBody
        } else if !cam.contains(bg1!) {
            print("bg1 is not in the scene")
            newPosBgY = (bg0?.position.y)! + self.frame.height
            bg1?.physicsBody = nil
            bg1?.position = CGPoint(x: self.frame.width / 2, y: newPosBgY)
            bg1?.physicsBody = bg0?.physicsBody
        } else if !cam.contains(bg2!) {
            print("bg2 is not in the scene")
            newPosBgY = (bg1?.position.y)! + self.frame.height
            bg2?.physicsBody = nil
            bg2?.position = CGPoint(x: self.frame.width / 2, y: newPosBgY)
            bg2?.physicsBody = bg1?.physicsBody
        }
    }
}

1 Ответ

0 голосов
/ 15 января 2019

Ну, наконец-то я понял, как этого добиться. Я надеюсь, что это помогает кому-то еще.

Я изначально создал и поместил два SKSpriteNode в качестве фона как bg0 и bg1, как показано ниже:

    bg0 = SKSpriteNode(imageNamed: "bg0")
    bg1 = SKSpriteNode(imageNamed: "bg1")

    bg0!.name = "bg0"
    bg1!.name = "bg1"

    bg0?.scale(to: CGSize(width: sceneWidth, height: sceneHeight))
    bg1?.scale(to: CGSize(width: sceneWidth, height: sceneHeight))

    bg0?.zPosition = zPosBg
    bg1?.zPosition = zPosBg

    backgroundArr.append(bg0!)
    backgroundArr.append(bg1!)

    bg0?.position = CGPoint(x: sceneWidth / 2, y: 0)
    bg1?.position = CGPoint(x: sceneWidth / 2, y: sceneHeight)

    self.addChild(bg0!)
    self.addChild(bg1!)

После, по методу update, который я вызвал ниже:

func updateBgPos() {
    guard let playerPosY = player?.position.y else { return }
    guard let bg0PosY = bg0?.position.y else { return }
    guard let bg1PosY = bg1?.position.y else { return }

    if playerPosY - bg0PosY > sceneHeight / 2 + camFollowGap {
        print("bg0 is not in the scene")
        newPosBgY = bg1PosY + sceneHeight
        bg0?.position = CGPoint(x: sceneWidth / 2, y: newPosBgY)
    } else if playerPosY - bg1PosY > sceneHeight / 2 + camFollowGap {
        print("bg1 is not in the scene")
        newPosBgY = bg0PosY + sceneHeight
        bg1?.position = CGPoint(x: sceneWidth / 2, y: newPosBgY)
    }
}

PS: camFollowGap - это значение CGFloat, которое я вычитал, когда помещал камеру в плеер. При работе с непрерывным фоном мне пришлось добавить это значение в расчет, чтобы избежать задержки позиционирования и появления временных промежутков между фонами.

...