Libgdx stage2d с другой камерой для HUD, как обрабатывать координаты?

1

Я использую сцену на экране игры. На этом этапе у меня есть актеры, такие как карта игры (где игрок может двигаться, а камера сцены движется вперед и масштабируется (или перемещается), чтобы сохранить видовое окно внутри карты), игрока и другого игрового материала. Затем я добавляю элемент HUD, который я делаю, расширяя Group:

public class Hud extends Group implements Disposable {

В этом классе я определяю новую OrthographicCamera:

hudCamera = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());

Я хочу использовать эту камеру, чтобы держать HUD неподвижным на экране. Я рисую вот так:

@Override
public void draw(SpriteBatch batch, float parentAlpha) {
    batch.setProjectionMatrix(hudCamera.combined);
    //Then draw my HUD stuff
}

Рисунок работает отлично, но проблема в (touch- и других) событиях. У них неправильные координаты. Как я могу это решить. Я попытался переопределить метод hit (float x, float y, boolean touchable) и подумал об переопределении методов localToParentCoordinates и parentToLocalCoordinates. Но что бы я их вложил (умножая на hudCamera.com, как при рисовании, или что-то в этом роде)? Или я думаю, что все это неправильно?

Я также обеспокоен тем, что, когда я использую масштабирование в своей сцене, это испортит координаты. Это реальность?

Теги:
libgdx
scene2d

2 ответа

12

Для создания HUD вы обычно можете использовать несколько этапов на вашем экране, которые отображаются поверх друг друга. У вас может быть даже больше двух, например, для Pause-Dialog, который отображается поверх HUD, когда приложение приостанавливается и возобновляется...

Вам просто нужно убедиться, что в render() -method они отображаются в правильном порядке:

public void render(float delta) {
  scene.act(delta);
  hud.act(delta);
  pauseDialog.act(delta);

  scene.draw();
  hud.draw();
  pauseDialog.draw();
}

Таким образом, вы можете создавать разные системы координат, как вам нравится. Особенно при работе со шрифтами и ярлыками в вашем HUD он должен иметь систему координат, которая соответствует размеру пикселя, например setViewport(1280,768,true); или аналогично, тогда как ваша сцена может иметь совершенно другую.

  • 0
    Да, сейчас я использую два этапа. Кажется, это намного понятнее. Спасибо за ваш ответ тоже.
  • 0
    Верри подробный и хорошо объясненный ответ! +1
Показать ещё 2 комментария
2

Я думаю, что camera.unproject(touchpos) должен работать, но я никогда не использовал его. Вам придется искать его.

Я бы предложил использовать 2 этапа, так как игра и HUD являются независимыми частями экрана. Используя 2 Stage вас есть 2 камеры, по 1 для каждого Stage. Затем вы можете перемещать игровую camera и HUD все равно будет находиться в том же положении.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню