Java - LibGDX - Проблемы с процессом рендеринга мозаичной карты
Эта проблема
Кажется, я не могу заставить Tiled карты правильно рендериться. Я использую LibGDX в качестве библиотеки для загрузки карты (Выпуск 1.6.0).
Видео демонстрация
Я создал видео, чтобы показать вам реальную проблему и упростить ее, пропустив весь процесс объяснения. Вот ссылка на него.
Код, который я использовал
protected Level level;
protected OrthogonalTiledMapRenderer mapRenderer;
protected OrthographicCamera camera;
protected TiledMap map;
protected MainGameLoop game;
protected SpriteBatch batch;
private BitmapFont font;
private int w, h;
public Level1(MainGameLoop game) {
this.game = game;
}
@Override
public void show() {
w = Gdx.graphics.getWidth();
h = Gdx.graphics.getHeight();
int CAMERA_WIDTH = 800;
int CAMERA_HEIGHT = 450 * (w / h);
camera = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT);
camera.setToOrtho(false);
camera.update();
map = new TmxMapLoader().load("maps/map1.tmx");
mapRenderer = new OrthogonalTiledMapRenderer(map);
Gdx.input.setInputProcessor(this);
font = new BitmapFont();
font.setColor(Color.BLUE);
batch = new SpriteBatch();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
camera.update();
mapRenderer.setView(camera);
mapRenderer.render();
batch.begin();
font.draw(batch, "Camera zoom: " + camera.zoom, 40, 40);
batch.end();
}
@Override
public void resize(int width, int height) {
camera.viewportWidth = width;
camera.viewportHeight = height;
camera.update();
}
@Override
public void dispose() {
mapRenderer.dispose();
map.dispose();
background.dispose();
Gdx.input.setInputProcessor(null);
}
@Override
public boolean scrolled(int amount) {
camera.zoom += amount;
camera.update();
return true;
}
// Here go the rest of the methods, such as pause, resume, hide, keyDown, keyUp, keyTyped, touchDown, touchUp, touchDragged & mouseMoved.
Решения, которые я пробовал
Я попытался использовать разные цифры для х и у камеры без удачи. Я также попытался перевести камеру в правильное положение (жестко закодировать ее), а также использовать другую карту ( другую карту тайлов и размеры), но это тоже не сработало.
Заключение
Я не могу найти способ решить эту проблему. Буду признателен за любую оказанную помощь. Большое спасибо.
1 ответ
Быстрое введение
Хорошо, через некоторое время мне удалось решить эту проблему, жестко запрограммировав некоторые вещи. Но это работает правильно, поэтому я доволен этим.
Что я сделал, чтобы решить проблему
- Прежде всего, я узнал точное число, которое я должен был использовать, чтобы увеличить мою плиточную карту, и это число:
3.125f
, - Затем, вместо использования пикселей для камеры, я использовал свои собственные единицы измерения (что я должен был сделать с первого момента).
- Сделав эти две вещи, я заметил, что карта была сильно увеличена. Итак, используя
scrolled
метод изInputProcessor
Мне удалось найти точное число, на котором карта должна была быть "не увеличена". - Я также узнал, что если я позвоню
setToOrtho(false)
метод изOrthographicCamera
объект, по какой-то странной причине масштабирует карту 19 раз. Если этот метод не вызывается, карта масштабируется только 1 раз
Код, который я сейчас использую
TiledMap tiledMap;
OrthographicCamera camera;
TiledMapRenderer tiledMapRenderer;
final float WIDTH = 8000;
final float HEIGHT = 4500;
final float num = 3.125f;
@Override
public void show() {
tiledMap = MapLoader.realm1_level1;
tiledMapRenderer = new OrthogonalTiledMapRenderer(tiledMap, num);
camera = new OrthographicCamera(WIDTH, HEIGHT);
Gdx.input.setInputProcessor(this);
camera.zoom += 1f;
camera.update();
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
tiledMapRenderer.setView(camera);
tiledMapRenderer.render();
}
// This method was just used for testing to see where
// the map was or should have been placed.
@Override
public boolean keyDown(int keycode) {
if (keycode == Input.Keys.LEFT)
camera.translate(-32, 0);
if (keycode == Input.Keys.RIGHT)
camera.translate(32, 0);
if (keycode == Input.Keys.UP)
camera.translate(0, 32);
if (keycode == Input.Keys.DOWN)
camera.translate(0, -32);
if (keycode == Input.Keys.NUM_1)
tiledMap.getLayers().get(0).setVisible(!tiledMap.getLayers().get(0).isVisible());
return true;
}
@Override
public void resize(int width, int height) {
camera.position.set(WIDTH, HEIGHT, 0);
camera.update();
}
@Override
public boolean scrolled(int amount) {
camera.zoom += amount;
camera.update();
return true;
}
@Override
public void dispose() {
tiledMap.dispose();
}
// And here go the rest of the methods that come from the
//Screen and the InputProcessor interfaces.
Заметки
- Числа, которые я использовал для
WIDTH
иHEIGHT
Переменные работают правильно, строго с плиточными картами, что их ширина составляет 80 плиток, а их высота составляет 45 плиток. - Если вы столкнулись с той же проблемой, вам нужно будет найти соответствующий номер, чтобы масштабировать карту вверх / вниз, в зависимости от используемых вами единиц измерения. Метод проб и ошибок - ваше единственное руководство. Если мы игнорируем Stackru, конечно.