Тем не менее, камера будет «выключена» TiledMap. Как я могу держать свою камеру на TiledMap, чтобы, когда я приблизился к краям своей карты, камера перестала прокручиваться, и игрок переместился к краю камеры?
Итак, вы работаете с двумя прямоугольниками здесь. Больший статический (карта) и меньший движущийся (камера) внутри него. Вы хотите, чтобы границы меньшего прямоугольника не выходили за пределы внутренних границ большего прямоугольника.
// 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;}
Так что логика довольно проста. Держите маленькую коробку внутри большей коробки. Как только вы поймете эту идею, не стесняйтесь свернуть этот код. Вы можете даже переместить его в ряд вложенных операторов Min / Max в слежении за положением камеры, если хотите.
Я должен идти спать раньше. Я реализовал нечто подобное, но не смог заставить его работать. Но вместо того, чтобы вызывать хороший setPosition()метод, который бы установил границы, я все еще устанавливал положение кулачка напрямую (например cam.position.set()). Это работает как талисман! Спасибо за объяснение!
Ariejan
7
Вы можете легко зафиксировать положение камеры на границах карты следующим образом:
@Cypher: это половина размера осей X и Y области просмотра.
Матиас
Так camViewportHalfXбудет эквивалент camera.viewportWidth / 2?
Cypher
0
Для перемещения Cameraв TiledMapпределах, OrthogonalTiledMapRendererбыл использован.
Я также заметил, что он ведет себя неожиданно: пока он Cameraдостигает границ карты, мозаичная карта, как и по инерции, сдвигает некоторые пиксели слишком далеко (это зависит от скорости пролистывания).
Как решение , каждое Cameraдвижение Cameraпринудительно помещается в границы карты. Смотрите putInMapBounds()метод.
Чтобы избежать глюков при TiledMapрендеринге, использовали Math.min(float, float).
Используйте этот слушатель для обработки вашего Camera:
setPosition()
метод, который бы установил границы, я все еще устанавливал положение кулачка напрямую (напримерcam.position.set()
). Это работает как талисман! Спасибо за объяснение!Вы можете легко зафиксировать положение камеры на границах карты следующим образом:
источник
camViewportHalfX
иcamViewportHalfY
?camViewportHalfX
будет эквивалентcamera.viewportWidth / 2
?Для перемещения
Camera
вTiledMap
пределах,OrthogonalTiledMapRenderer
был использован.Я также заметил, что он ведет себя неожиданно: пока он
Camera
достигает границ карты, мозаичная карта, как и по инерции, сдвигает некоторые пиксели слишком далеко (это зависит от скорости пролистывания).Как решение , каждое
Camera
движениеCamera
принудительно помещается в границы карты. СмотритеputInMapBounds()
метод.Чтобы избежать глюков при
TiledMap
рендеринге, использовалиMath.min(float, float)
.Используйте этот слушатель для обработки вашего
Camera
:источник
Если у вас есть коэффициент увеличения, я считаю, что он работает намного лучше:
источник