2017-01-24 92 views
5

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).

enter image description here

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 
    } 
} 
+0

gdzie otrzymujesz pozycję (0,5, 0,5) dla kamery? – Confused

+0

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

+0

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

Odpowiedz

4

Aparat znajduje się w punkcie w pikselach 0,5 punktu na prawo od centrum i 0,5 punktu w górę od środka. Przy (0, 0) kamera jest martwym środkiem ekranu.

Myślę, że popełniony błąd jest koncepcyjny, myśląc, że punkt zakotwiczenia sceny (0,5, 0,5) jest taki sam, jak środkowe współrzędne sceny.

Jeśli pracujesz w pikselach, co wydaje się, że jesteś, to pozycja kamery (500, 700) będzie w prawym górnym rogu mapy, (-500, -700) będzie na dole lewo.

Zakłada się, że używasz kotwicy punktu środkowego, która jest domyślnie dołączona do szablonu Xcode SpriteKit.

Co oznacza, że ​​odpowiedź na Twoje pytanie brzmi: Dosłownie przesuń kamerę w dowolne miejsce wokół mapy, ponieważ teraz będziesz pewny, że jest to dosłownie piksel.

Z jednym zastrzeżeniem ...

wiele gier użyć ograniczeń zatrzymać aparat nieco zanim dojdzie do krawędzi mapy tak, że mapa nie jest pół off i pół na ekranie. W ten sposób pokazuje się krawędź mapy, ale najdalszy ruch kamery wystarczy, by odsłonić tę krawędź mapy. Staje się to wysiłkiem opartym na ograniczeniach, gdy masz gracza/postać, która może chodzić/poruszać się do krawędzi, ale kamera nie idzie tak daleko.

+1

Dobra odpowiedź. –