У меня есть трудное время, устанавливающее границы и позиционирование камеры должным образом в моем представлении после панорамирования. Итак, вот мой сценарий.Правильное положение камеры при панорамировании
У меня есть узел, который больше, чем экран, и я хочу, чтобы пользователь обходил вокруг, чтобы увидеть полную карту. Мой узел равен 1000 by 1400
, когда вид 640 by 1136
. У Sprites внутри узла карты есть якорная точка по умолчанию. Затем я добавил камеру к узлу карты и установил ее позицию на (0.5, 0.5)
.
Теперь мне интересно, если я должен быть изменения положения камеры или узла карты, когда пользователь двигает экран? Первый подход кажется проблематичным, поскольку я не могу просто добавить перевод в положение камеры, потому что позиция определяется как (0,5, 0,5), а значения перевода намного больше. Поэтому я попытался умножить/делить его на размер экрана, но это, похоже, не работает. Улучшен ли второй подход?
var map = Map(size: CGSize(width: 1000, height: 1400))
override func didMove(to view: SKView) {
(...)
let pan = UIPanGestureRecognizer(target: self, action: #selector(panned(sender:)))
view.addGestureRecognizer(pan)
self.anchorPoint = CGPoint.zero
self.cam = SKCameraNode()
self.cam.name = "camera"
self.camera = cam
self.addChild(map)
self.map.addChild(self.cam!)
cam.position = CGPoint(x: 0.5, y: 0.5)
}
var previousTranslateX:CGFloat = 0.0
func panned (sender:UIPanGestureRecognizer) {
let currentTranslateX = sender.translation(in: view!).x
//calculate translation since last measurement
let translateX = currentTranslateX - previousTranslateX
let xMargin = (map.nodeSize.width - self.frame.width)/2
var newCamPosition = CGPoint(x: cam.position.x, y: cam.position.y)
let newPositionX = cam.position.x*self.frame.width + translateX
// since the camera x is 320, our limits are 140 and 460 ?
if newPositionX > self.frame.width/2 - xMargin && newPositionX < self.frame.width - xMargin {
newCamPosition.x = newPositionX/self.frame.width
}
centerCameraOnPoint(point: newCamPosition)
//(re-)set previous measurement
if sender.state == .ended {
previousTranslateX = 0
} else {
previousTranslateX = currentTranslateX
}
}
func centerCameraOnPoint(point: CGPoint) {
if cam != nil {
cam.position = point
}
}
где вы получаете позицию (0,5, 0,5) для камеры? – Confused
wait .. Я думаю, что вижу, что вы сделали ... вы начали с шаблона по умолчанию из Xcode? И не изменили опорные точки сцены? – Confused
Я смешал anchorPoint (который вы можете определить так) с позицией камеры. Причина в этом случае составляет 0,5 пикселя от центра. Я установил привязку сцены к 0.0 в 'didLoad'. Не трогали их иначе. – owca