Trudno jest ustawić granice i prawidłowo ustawić kamerę w moim widoku po panoramowaniu. Oto mój scenariusz.Poprawnie umieść kamerę podczas panoramowania
Mam węzeł większy niż ekran i chcę pozwolić użytkownikowi przeglądać całą mapę. Mój węzeł to 1000 by 1400
, gdy widok to 640 by 1136
. Spryty wewnątrz węzła mapy mają domyślny punkt kontrolny. Następnie dodałem kamerę do węzła mapy i ustawię ją na (0.5, 0.5)
.
Teraz zastanawiam się czy powinienem zmienić położenie kamery lub węzeł mapy, gdy użytkownik patelnie ekran? Pierwsze podejście wydaje się być problematyczne, ponieważ nie mogę po prostu dodać tłumaczenia do pozycji kamery, ponieważ pozycja jest zdefiniowana jako (0,5; 0,5), a wartości translacji są znacznie większe. Próbowałem więc pomnożyć/podzielić go przez rozmiar ekranu, ale to nie działa. Czy drugie podejście jest lepsze?
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
}
}
gdzie otrzymujesz pozycję (0,5, 0,5) dla kamery? – Confused
czekaj .. Myślę, że widzę, co zrobiłeś ... czy zacząłeś od domyślnego szablonu z Xcode? I nie zmieniłeś punktów kotwicy Sceny? – Confused
Zmieszałem anchorPoint (który można zdefiniować w ten sposób) z pozycją kamery. Przyczyna w tym przypadku wynosi 0,5 piksela od centrum. Ustawiam anchorPoint sceny na 0.0 w 'didLoad'. Nie dotykaj ich inaczej. – owca