Sin embargo, la cámara se moverá "fuera" del TiledMap. ¿Cómo podría mantener mi cámara en el TiledMap, de modo que cuando me acerco a los bordes de mi mapa, la cámara deja de desplazarse y el jugador se mueve hacia el borde de la cámara?
Muy bien, entonces estás trabajando con dos rectángulos aquí. Una estática más grande (el mapa) y una más pequeña en movimiento (la cámara) dentro de ella. Lo que desea es no dejar que los límites del rectángulo más pequeño se muevan fuera de los límites internos del rectángulo más grande.
// 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;}
Entonces la lógica es bastante simple. Mantenga la caja pequeña dentro de la caja más grande. Una vez que comprenda esa idea, siéntase libre de colapsar ese código. Incluso podría moverlo a una serie de declaraciones Min / Max anidadas en el seguimiento de posición de su cámara si lo prefiere.
Debería acostarme antes. Tenía algo como esto implementado, pero no pude hacerlo funcionar. Pero en lugar de llamar a un buen setPosition()método, eso arreglaría los límites, todavía estaba configurando la posición de la leva directamente (por ejemplo cam.position.set()) ¡Esto funciona de maravilla! ¡Gracias por la explicación!
Ariejan
7
Puede sujetar fácilmente la posición de la cámara a los límites del mapa de esta manera:
@Cypher: tiene la mitad del tamaño de los ejes X e Y de la ventana gráfica.
Matthias
Entonces camViewportHalfX, ¿ sería el equivalente a camera.viewportWidth / 2?
Cypher
0
Para moverse Cameraen los TiledMaplímites, OrthogonalTiledMapRendererse utilizó.
También he notado que se comporta inesperadamente: mientras Cameraalcanza los límites del mapa, el mapa en mosaico, como por inercia, mueve algunos píxeles demasiado (depende de la velocidad del deslizamiento).
Como solución , en cada Cameramovimiento, Camerase pone a la fuerza en los límites del mapa. Ver putInMapBounds()método
Para evitar fallas en el TiledMaprenderizado, se utiliza Math.min(float, float).
setPosition()
método, eso arreglaría los límites, todavía estaba configurando la posición de la leva directamente (por ejemplocam.position.set()
) ¡Esto funciona de maravilla! ¡Gracias por la explicación!Puede sujetar fácilmente la posición de la cámara a los límites del mapa de esta manera:
fuente
camViewportHalfX
ycamViewportHalfY
?camViewportHalfX
, ¿ sería el equivalente acamera.viewportWidth / 2
?Para moverse
Camera
en losTiledMap
límites,OrthogonalTiledMapRenderer
se utilizó.También he notado que se comporta inesperadamente: mientras
Camera
alcanza los límites del mapa, el mapa en mosaico, como por inercia, mueve algunos píxeles demasiado (depende de la velocidad del deslizamiento).Como solución , en cada
Camera
movimiento,Camera
se pone a la fuerza en los límites del mapa. VerputInMapBounds()
métodoPara evitar fallas en el
TiledMap
renderizado, se utilizaMath.min(float, float)
.Use este oyente para manejar su
Camera
:fuente
Si tiene que cuidar el factor de zoom, descubrí que esto funciona mucho mejor:
fuente