Jednak kamera przesunie się „poza” TiledMap. Jak mogę trzymać kamerę na TiledMap, więc kiedy zbliżam się do krawędzi mapy, kamera przestaje się przewijać, a gracz przesuwa się w kierunku krawędzi kamery?
W porządku, więc pracujesz tutaj z dwoma prostokątami. Większy statyczny (mapa) i mniejszy ruchomy (kamera) wewnątrz. Chcemy, aby granice mniejszego prostokąta nie poruszały się poza wewnętrznymi granicami większego prostokąta.
// These values likely need to be scaled according to your world coordinates.// The left boundary of the map (x)int mapLeft =0;// The right boundary of the map (x + width)int mapRight =0+ map.getWidth();// The bottom boundary of the map (y)int mapBottom =0;// The top boundary of the map (y + height)int mapTop =0+ map.getHeight();// The camera dimensions, halvedfloat cameraHalfWidth = cam.viewportWidth *.5f;float cameraHalfHeight = cam.viewportHeight *.5f;// Move camera after player as normalfloat cameraLeft = cam.position.x - cameraHalfWidth;float cameraRight = cam.position.x + cameraHalfWidth;float cameraBottom = cam.position.y - cameraHalfHeight;float cameraTop = cam.position.y + cameraHalfHeight;// Horizontal axisif(map.getWidth()< cam.viewportWidth){
cam.position.x = mapRight /2;}elseif(cameraLeft <= mapLeft){
cam.position.x = mapLeft + cameraHalfWidth;}elseif(cameraRight >= mapRight){
cam.position.x = mapRight - cameraHalfWidth;}// Vertical axisif(map.getHeight()< cam.viewportHeight){
cam.position.y = mapTop /2;}elseif(cameraBottom <= mapBottom){
cam.position.y = mapBottom + cameraHalfHeight;}elseif(cameraTop >= mapTop){
cam.position.y = mapTop - cameraHalfHeight;}
Logika jest więc dość prosta. Trzymaj małe pudełko wewnątrz większego pudełka. Gdy zrozumiesz ten pomysł, możesz zwinąć ten kod. Możesz nawet przenieść go do szeregu zagnieżdżonych instrukcji Min / Max w śledzeniu pozycji kamery, jeśli wolisz.
Powinienem iść wcześniej do łóżka. Zaimplementowałem coś takiego, ale nie mogłem tego uruchomić. Ale zamiast wywoływać fajną setPosition()metodę, która naprawiłaby granice, wciąż ustawiałem bezpośrednio pozycję kamery (np. cam.position.set()) To działa jak urok! Dziękuję za wyjaśnienie!
Ariejan
7
Możesz łatwo zablokować pozycję kamery do granic mapy w następujący sposób:
@Cypher: Jest o połowę mniejszy od osi X i Y rzutni.
Matthias
Czy camViewportHalfXbyłby to odpowiednik camera.viewportWidth / 2?
Cypher
0
Do poruszania się Cameraw TiledMapgranicach OrthogonalTiledMapRendererużyto.
Zauważyłem też, że zachowuje się nieoczekiwanie: gdy Cameraosiąga granice mapy, mapa kafelkowa, podobnie jak bezwładność, przesuwa się o kilka pikseli za daleko (zależy to od prędkości przeciągnięcia).
Jako rozwiązanie , przy każdym Cameraruchu, Camerajest siłą umieszczane w granicach mapy. Zobacz putInMapBounds()metodę.
Aby uniknąć błędów w TiledMaprenderowaniu, zastosowano Math.min(float, float).
setPosition()
metodę, która naprawiłaby granice, wciąż ustawiałem bezpośrednio pozycję kamery (np.cam.position.set()
) To działa jak urok! Dziękuję za wyjaśnienie!Możesz łatwo zablokować pozycję kamery do granic mapy w następujący sposób:
źródło
camViewportHalfX
icamViewportHalfY
?camViewportHalfX
byłby to odpowiednikcamera.viewportWidth / 2
?Do poruszania się
Camera
wTiledMap
granicachOrthogonalTiledMapRenderer
użyto.Zauważyłem też, że zachowuje się nieoczekiwanie: gdy
Camera
osiąga granice mapy, mapa kafelkowa, podobnie jak bezwładność, przesuwa się o kilka pikseli za daleko (zależy to od prędkości przeciągnięcia).Jako rozwiązanie , przy każdym
Camera
ruchu,Camera
jest siłą umieszczane w granicach mapy. ZobaczputInMapBounds()
metodę.Aby uniknąć błędów w
TiledMap
renderowaniu, zastosowanoMath.min(float, float)
.Użyj tego detektora do obsługi
Camera
:źródło
Jeśli masz do zrobienia współczynnik powiększenia, okazało się, że działa on znacznie lepiej:
źródło