Как определить конкретные узлы в представлении SKCamera?
Я пытаюсь утилизировать то же самое 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 ответ
Ну наконец-то я разобрался, как этого добиться. Я надеюсь, что это помогает кому-то еще.
Я изначально создал и разместил два 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
значение, которое я вычел, когда я помещаю камеру в плеер. При работе с непрерывным фоном мне пришлось добавить это значение в расчет, чтобы избежать задержки позиционирования и появления временных промежутков между фонами.