Изменение системы координат в LibGDX (Java)
LibGDX имеет систему координат, где (0,0) находится в левом нижнем углу. (как это изображение:http://i.stack.imgur.com/jVrJ0.png)
Это заставляет меня биться головой о стену, главным образом потому, что я портирую игру, которую я уже сделал с обычной системой координат (где 0,0 находится в верхнем левом углу).
мой вопрос: есть ли простой способ изменить эту систему координат?
6 ответов:
Если вы используете камеру (что вы должны) изменение системы координат довольно просто:
camera= new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); camera.setToOrtho(true, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
Если вы используете TextureRegions и / или TextureAtlas, все, что вам нужно сделать в дополнение к этому, это вызвать регион.флип (ложь, истина).
причины, по которым мы используем y-up по умолчанию (которые вы можете легко изменить, как показано выше), заключаются в следующем:
- ваш код моделирования, скорее всего, будет использовать стандартную евклидову систему координат с г-вверх
- если вы идете 3D у вас есть y-up
- система координат по умолчанию является правой рукой в OpenGL, с y-up. Конечно, вы можете легко изменить это с помощью магии матрицы.
единственные два места в libgdx, где мы используем y-down являются:
- пиксельные координаты (верхний верхний левый источник, y-вниз)
- координаты события касания, которые заданы в координатах окна (верхний верхний левый источник, Ъ-вниз)
опять же, вы можете легко изменить используемую систему координат на все, что вы хотите, используя либо камеру, либо крошечный кусочек матричного математики.
просто чтобы немного расширить то, что сказал 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); }
Если вы хотите скрыть преобразование и не думать об этом после его настройки один раз, вы можете создать класс, который наследует все необходимые функции, но сначала преобразует координаты перед передачей его в функцию родительского класса. К сожалению, это займет много времени.
вы могли бы также сделать метод, который делает простые
y' = height - y
трансформация в целомCoordinate
объект (или то, что вы используете), и вызвать его один раз перед каждым операция.
интересная графическая библиотека, я бы сказал. Я нашел эту оценку по ссылке ниже:
еще одна проблема заключалась в том, что использовались разные системы координат в разных частях Libgdx. Иногда происхождение топоров находилось в нижний левый угол с осью y, направленной вверх, а иногда и внутрь верхний левый угол спрайта вниз. При рисовании Сетка начала координат была даже в центре экрана. Это вызвало вполне себе немного путаницы и дополнительной работы, чтобы получить все в правильное место на экране.
Я только что сделал класс, который расширяет
SpriteBatch
что переопределяет некоторые методы добавленияy = Gdx.graphics.getHeight() - y - height
. Просто, но эффективно.
Не уверен, что это помогает кому-либо или нет, но я смог получить текстуры и корректная визуализация шрифтов с использованием предложенной перевернутой системы координат через 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, логическое значение переворачивает шрифт
- для партии.draw() вам нужно использовать все эти параметры, потому что вам нужен логический флип в конце, чтобы перевернуть текстуру (я могу расширьте SpriteBatch или сделайте служебный метод, чтобы избежать передачи такого количества параметров все время.)
- уведомления партию.setProjectionMatrix (cam.комбинированный); в render ()
теперь мы увидим, вернусь ли я сюда позже сегодня вечером, чтобы исправить любые другие проблемы или открытия, делая все это. :)
Comments