2017-01-24 5 views
5

У меня есть трудное время, устанавливающее границы и позиционирование камеры должным образом в моем представлении после панорамирования. Итак, вот мой сценарий.Правильное положение камеры при панорамировании

У меня есть узел, который больше, чем экран, и я хочу, чтобы пользователь обходил вокруг, чтобы увидеть полную карту. Мой узел равен 1000 by 1400, когда вид 640 by 1136. У Sprites внутри узла карты есть якорная точка по умолчанию. Затем я добавил камеру к узлу карты и установил ее позицию на (0.5, 0.5).

enter image description here

Теперь мне интересно, если я должен быть изменения положения камеры или узла карты, когда пользователь двигает экран? Первый подход кажется проблематичным, поскольку я не могу просто добавить перевод в положение камеры, потому что позиция определяется как (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

где вы получаете позицию (0,5, 0,5) для камеры? – Confused

+0

wait .. Я думаю, что вижу, что вы сделали ... вы начали с шаблона по умолчанию из Xcode? И не изменили опорные точки сцены? – Confused

+0

Я смешал anchorPoint (который вы можете определить так) с позицией камеры. Причина в этом случае составляет 0,5 пикселя от центра. Я установил привязку сцены к 0.0 в 'didLoad'. Не трогали их иначе. – owca

ответ

4

Ваша камера на самом деле находится в пиксельной точке 0,5 пункта справа от центра и на 0,5 пункта от центра. На (0, 0) ваша камера находится в мертвой точке экрана.

Я думаю, что ошибка, которую вы сделали, является концептуальной, считая, что опорная точка сцены (0,5, 0,5) совпадает с центральными координатами сцены.

Если вы работаете в пикселях, которые, как вам кажется, тогда положение камеры (500, 700) будет в правом верхнем углу вашей карты, (-500, -700) будет внизу оставил.

Предполагается, что вы используете якорь средней точки, который поставляется по умолчанию с шаблоном Xcode SpriteKit.

Это означает, что ответ на ваш вопрос: Буквально перемещайте камеру, как вам угодно, вокруг вашей карты, так как теперь вы будете уверены в знании, что это пиксель буквальный.

С одной оговоркой ...

много игр используют ограничение, чтобы остановить камеру несколько, прежде чем он попадет на край карты так, чтобы карта не половина от половины и на экране. Таким образом, край карты отображается, но самый дальний путь камеры - достаточно, чтобы открыть этот край карты. Это становится основанием для ограничений, когда у вас есть игрок/персонаж, который может ходить/двигаться к краю, но камера не проходит весь путь.

+1

Хороший ответ Смущенный. –