Изменение системы координат в LibGDX (Java) - PullRequest
55 голосов
/ 10 октября 2011

LibGDX имеет систему координат, где (0,0) слева внизу. (как это изображение: http://i.stack.imgur.com/jVrJ0.png)

Это заставляет меня биться головой о стену, главным образом потому, что я портирую игру, которую я уже сделал, с обычной системой координат (где 0,0 в верхнем левом углу).

Мой вопрос: Есть ли простой способ изменить эту систему координат?

Ответы [ 6 ]

117 голосов
/ 13 октября 2011

Если вы используете камеру (что вам и нужно), изменить систему координат довольно просто:

camera= new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
camera.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

Если вы используете TextureRegions и / или TextureAtlas, все, что вам нужно сделать в дополнение к этому, этовызовите region.flip (false, true).

Причины, по которым мы используем y-up по умолчанию (который вы можете легко изменить, как показано выше) следующие:

  • ваш код моделирования, скорее всего, будет использовать стандартную евклидову систему координатс y-up
  • если вы идете в 3D, у вас есть y-up
  • Система координат по умолчанию - это правосторонняя система координат в OpenGL с y-up.Конечно, вы можете легко изменить это с помощью некоторой матрицы магии.

В libgdx есть только два места, где мы используем y-down:

  • Пиксельные координаты (вверху слева вверху)начало координат, у-вниз)
  • координаты события касания, заданные в координатах окна (верхний левый верхний угол, у-вниз)

Опять же, вы можете легко изменить используемую систему координатна все, что вы хотите, используя камеру или немного математики.

9 голосов
/ 24 августа 2013

Просто чтобы немного расширить сказанное выше badlogic, если вы используете TextureAtlas (с TextureRegions), вам нужно перевернуть их, как сказал badlogic, в дополнение к работе камеры. Если вы используете TextureAtlas, вы можете использовать этот код сразу после загрузки вашего атласа:

String textureFile = "data/textures.txt";  
atlas = new TextureAtlas(Gdx.files.internal(textureFile), Gdx.files.internal("data"));  
// Let's flip all the regions.  Required for y=0 is TOP
Array<AtlasRegion> tr = atlas.getRegions();      
for (int i = 0; i < tr.size; i++) {
  TextureRegion t = tr.get(i);
  t.flip(false, true);
}
6 голосов
/ 10 октября 2011

Если вы хотите скрыть преобразование и не думать о нем после его настройки один раз, вы можете создать класс, который наследует все необходимые вам функции, но сначала преобразует координаты, прежде чем передать его в функцию своего родительского класса. К сожалению, это заняло бы много времени.

В качестве альтернативы вы можете создать метод, который выполняет простое преобразование y' = height - y для всего объекта Coordinate (или того, что вы используете), и вызывать его один раз перед каждой операцией.

5 голосов
/ 10 октября 2011

Интересная графическая библиотека, я бы сказал.Я нашел эту оценку по ссылке ниже:

Другая проблема заключалась в том, что разные системы координат использовались в разных частях Libgdx.Иногда начало осей находилось в нижнем левом углу с осью Y, направленной вверх, а иногда в верхнем левом углу спрайта, направленной вниз.При рисовании сетки исходная точка находилась даже в центре экрана.Это вызвало немало путаницы и дополнительной работы, чтобы все расположить на экране в нужном месте.

http://www.csc.kth.se/utbildning/kandidatexjobb/datateknik/2011/rapport/ahmed_rakiv_OCH_aule_jonas_K11072.pdf

1 голос
/ 18 августа 2016

Я только что создал класс, который расширяет SpriteBatch, который переопределяет определенные методы, добавляя y = Gdx.graphics.getHeight() - y - height. Просто, но эффективно.

0 голосов
/ 04 октября 2015

Не уверен, поможет ли это кому-либо или нет, но мне удалось получить текстуры и , которые правильно отображают шрифты, используя предложенную перевернутую систему координат через OrthographicCamera.Вот что я сделал:

private SpriteBatch batch;
private BitmapFont font;
private OrthographicCamera cam;
private Texture tex;

@Override
public void create () {
    batch = new SpriteBatch();

    font = new BitmapFont(true);
    font.setColor(Color.WHITE);

    cam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    cam.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    tex = new Texture("badlogic.jpg");
}

@Override
public void dispose() {
    batch.dispose();
    font.dispose();
    tex.dispose();
}

@Override
public void render () {
    cam.update();
    batch.setProjectionMatrix(cam.combined);

    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    batch.begin();

    font.draw(batch, "Test", 50, 50);
    batch.draw(tex, 100, 100, tex.getWidth(), tex.getHeight(), 0, 0, tex.getWidth(), tex.getHeight(), false, true);

    batch.end();
}

Важные вещи, на которые стоит обратить внимание:

  • Конструктор BitmapFont, логическое значение переворачивает шрифт
  • Для batch.draw ()вам нужно использовать все эти параметры, потому что вам нужен логический flipY в конце, чтобы перевернуть текстуру (я могу расширить SpriteBatch или создать служебный метод, чтобы не передавать столько параметров постоянно).
  • Обратите внимание на пакет.setProjectionMatrix (cam.combined);in render ()

Теперь мы увидим, вернусь ли я сюда сегодня вечером и буду делать правки, чтобы исправить любые другие проблемы или открытия, связанные с выполнением всего этого.:)

...