Я использую сцену на экране игры. На этом этапе у меня есть актеры, такие как карта игры (где игрок может двигаться, а камера сцены движется вперед и масштабируется (или перемещается), чтобы сохранить видовое окно внутри карты), игрока и другого игрового материала. Затем я добавляю элемент 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, как при рисовании, или что-то в этом роде)? Или я думаю, что все это неправильно?
Я также обеспокоен тем, что, когда я использую масштабирование в своей сцене, это испортит координаты. Это реальность?
Для создания 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);
или аналогично, тогда как ваша сцена может иметь совершенно другую.
Я думаю, что camera.unproject(touchpos)
должен работать, но я никогда не использовал его. Вам придется искать его.
Я бы предложил использовать 2 этапа, так как игра и HUD являются независимыми частями экрана. Используя 2 Stage
вас есть 2 камеры, по 1 для каждого Stage
. Затем вы можете перемещать игровую camera
и HUD все равно будет находиться в том же положении.