Использование unProject правильно в Java Libgdx

Я хочу сделать кнопку нажатой, но она не работает - кажется, мне нужно использовать unproject(), но я не могу понять, как это сделать. Этот код:

Texture playButtonImage;
SpriteBatch batch;
ClickListener clickListener;
Rectangle playButtonRectangle;
Vector2 touchPos;
OrthographicCamera camera;

@Override
public void show() {
    playButtonImage = new Texture(Gdx.files.internal("PlayButton.png"));

    camera = new OrthographicCamera();
    camera.setToOrtho(false, 800, 480);
    batch = new SpriteBatch();

    playButtonRectangle = new Rectangle();
    playButtonRectangle.x = 400;
    playButtonRectangle.y = 250;
    playButtonRectangle.width = 128;
    playButtonRectangle.height = 64;
}

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0, 0, 0.2f, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    camera.update();
    batch.setProjectionMatrix(camera.combined);

    batch.begin();
    batch.draw(playButtonImage, playButtonRectangle.x, playButtonRectangle.y);
    batch.end();

    if (Gdx.input.isTouched()) {
        Vector2 touchPos = new Vector2();
        touchPos.set(Gdx.input.getX(), Gdx.input.getY());


        if (playButtonRectangle.contains(touchPos)) {
            batch.begin();
            batch.draw(playButtonImage, 1, 1);
            batch.end();
        }
    }
}

Ответ 1

В общем случае вы используете camera.unproject(Vector) для преобразования координат экрана с одного клика или прикосновения к вашему игровому миру. Это необходимо, потому что происхождение не обязательно одинаково, и с помощью камеры вы также можете увеличивать и уменьшать масштаб, перемещаться, вращаться и т.д. Unprojecting позаботится обо всем этом и даст вам координату игрового мира, соответствующую позиции указателей.

В вашем примере это будет выглядеть так:

Vector3 touchPos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(touchPos);

Сказав это, вы должны фактически не выполнять эту задачу пользовательского интерфейса вручную. Libgdx также имеет некоторые функции пользовательского интерфейса, которые называются Stage (см. this). Уже доступно множество виджетов (см. это). Они используют скины (здесь вы можете получить базовый вариант , вам нужны все файлы uiskin. *). Они автоматически пересылают inputevents в так называемый Actors, например. кнопку, и вам просто нужно реализовать обработку этих событий.

Ответ 2

с функцией camera.unproject(Vector3); вы можете перевести координаты экрана в координаты мира игры.

Vector3 tmpCoords = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(tmpCoords);

tmpCoords.x //is now the touched X coordinate in the game world coordinate system
tmpCoords.y //is now the touched Y coordinate in the game world coordinate system.

В дополнение к этому лучше всего определить tmpVector как поле для создания объекта Vector3 только один раз. Затем вы можете сделать то же самое с методом .set().

tmpCoords.set(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(tmpCoords);

tmpCoords.x //is now the touched X coordinate in the game world coordinate system
tmpCoords.y //is now the touched Y coordinate in the game world coordinate system.

Поэтому вы уменьшаете создание объекта и удаляете ненужные вызовы GC, которые приводят к микролаге.

Ответ 3

@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 0, 0.2f, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

camera.update();
batch.setProjectionMatrix(camera.combined);

batch.begin();
batch.draw(playButtonImage, playButtonRectangle.x, playButtonRectangle.y);
batch.end();

if (Gdx.input.isTouched()) {
    Vector3 touchPos = new Vector3();
    touchPos.set(Gdx.input.getX(), Gdx.input.getY(),0);
    camera.unproject(touchPos);


    if (playButtonRectangle.contains(touchPos.x, touchPos.y)) {
        batch.begin();
        batch.draw(playButtonImage, 1, 1);
        batch.end();
    }
   }
   }

Ответ 4

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

camera.unproject(touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0));