No entanto, a câmera "desliga" o TiledMap. Como posso manter minha câmera no TiledMap, para que, quando me aproximo das bordas do mapa, a câmera pare de rolar e o player se mova em direção à borda da câmera?
Tudo bem, então você está trabalhando com dois retângulos aqui. Um estático maior (o mapa) e outro menor (a câmera) dentro dele. O que você deseja é não deixar que os limites do retângulo menor se movam para fora dos limites internos do retângulo maior.
// 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;}
Então a lógica é bem simples. Mantenha a caixa pequena dentro da caixa maior. Depois de entender essa ideia, sinta-se à vontade para recolher esse código. Você pode até movê-lo para uma série de instruções Mín / Máx. Aninhadas no rastreamento de posição da câmera, se preferir.
Eu deveria ir para a cama mais cedo. Eu tinha algo assim implementado, mas não consegui fazê-lo funcionar. Mas, em vez de chamar um setPosition()método legal , que corrigisse os limites, eu ainda estava definindo a posição da câmera diretamente (por exemplo cam.position.set()) Isso funciona como um encanto! Obrigada pelo esclarecimento!
Ariejan
7
Você pode fixar facilmente a posição da câmera nos limites do mapa como este:
@ Code: É metade do tamanho dos eixos X e Y da janela de visualização.
Matthias
Então camViewportHalfXseria o equivalente a camera.viewportWidth / 2?
precisa
0
Para se mover Cameradentro dos TiledMaplimites, OrthogonalTiledMapRendererfoi utilizado.
Também notei que ele se comporta de maneira inesperada: enquanto Cameraatinge os limites do mapa, o mapa lado a lado, como por inércia, move alguns pixels demais (depende da velocidade do golpe).
Como solução , em cada Cameramovimento, Cameraé colocado à força nos limites do mapa. Veja o putInMapBounds()método
Para evitar falhas na TiledMaprenderização, usado Math.min(float, float).
setPosition()
método legal , que corrigisse os limites, eu ainda estava definindo a posição da câmera diretamente (por exemplocam.position.set()
) Isso funciona como um encanto! Obrigada pelo esclarecimento!Você pode fixar facilmente a posição da câmera nos limites do mapa como este:
fonte
camViewportHalfX
ecamViewportHalfY
?camViewportHalfX
seria o equivalente acamera.viewportWidth / 2
?Para se mover
Camera
dentro dosTiledMap
limites,OrthogonalTiledMapRenderer
foi utilizado.Também notei que ele se comporta de maneira inesperada: enquanto
Camera
atinge os limites do mapa, o mapa lado a lado, como por inércia, move alguns pixels demais (depende da velocidade do golpe).Como solução , em cada
Camera
movimento,Camera
é colocado à força nos limites do mapa. Veja oputInMapBounds()
métodoPara evitar falhas na
TiledMap
renderização, usadoMath.min(float, float)
.Use este ouvinte para lidar com
Camera
:fonte
Se você tem o fator de zoom para cuidar, achei que funcionaria muito melhor:
fonte