Применение координат пикселей к координатам экрана

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

public class Core implements ApplicationListener, InputProcessor
          { //Has to be here otherwise the code formatting becomes buggy


private Mesh squareMesh;
private PerspectiveCamera camera;
private Texture texture;
private SpriteBatch spriteBatch;
Sprite sprite;
float moveX = 0;


private final Matrix4 viewMatrix = new Matrix4();
private final Matrix4 transformMatrix = new Matrix4();

@Override
public void create()
{
    Gdx.input.setInputProcessor(this);


    texture = new Texture(Gdx.files.internal("door.png"));

    spriteBatch = new SpriteBatch();
    sprite = new Sprite(texture);
    sprite.setPosition(0, 0);
    viewMatrix.setToOrtho2D(0, 0, 480, 320);

    float x = 0;
    float y = 0;

}

@Override
public void dispose()
{
}

@Override
public void pause()
{
}

@Override
public void render()
{
    viewMatrix.setToOrtho2D(0, 0, 480, 320);
    spriteBatch.setProjectionMatrix(viewMatrix);
    spriteBatch.setTransformMatrix(transformMatrix);
    spriteBatch.begin();
    spriteBatch.disableBlending();
    spriteBatch.setColor(Color.WHITE);

    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);


    //spriteBatch.draw(texture, 0, 0, 1, 1, 0, 0, texture.getWidth(),
    //      texture.getHeight(), false, false);
    sprite.draw(spriteBatch);
    spriteBatch.end();
    update();
}

@Override
public void resize(int width, int height)
{
    float aspectRatio = (float) width / (float) height;
    camera = new PerspectiveCamera(67, 2f * aspectRatio, 2f);

}

@Override
public void resume()
{
}

public void update()
{

    float delta = Gdx.graphics.getDeltaTime();

    if(Gdx.input.isTouched())
    {
         Vector3 worldCoordinates = new Vector3(sprite.getX(), sprite.getY(), 0);
         camera.unproject(worldCoordinates);
        sprite.setPosition(Gdx.input.getX(), Gdx.input.getY());

        float moveX = 0;
        float moveY = 0;

 }
     }

Я обрезал этот код для простоты. Я также сделал видео, демонстрирующее ошибку: http://www.youtube.com/watch?v=m89LpwMkneI


person Derek    schedule 12.11.2011    source источник


Ответы (4)


Camera.unproject преобразует координаты экрана в мировые координаты.

Vector3 pos = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(pos);
sprite.setPosition(pos.x, pos.y);
person Teoh Han Hui    schedule 16.07.2012
comment
Пробовал принятое решение, но оно становится очень громоздким, когда меняется разрешение экрана. Это путь, если вы не хотите переписывать все необходимые расчеты. - person MxLDevs; 07.04.2014
comment
Я изменил принятый ответ. Это было опубликовано после того, как я принял первый ответ. - person Derek; 17.04.2015

Во-первых, Gdx.input.getX() и Gdx.input.getY() возвращают «экранные координаты». Вы хотите преобразовать их в свои «координаты камеры». Координаты экрана обычно имеют (0,0) в верхнем левом углу окна. Я думаю, что координаты вашей камеры имеют (0,0) в левом нижнем углу (либо libgdx, либо opengl делают это). Ваше видео, кажется, предполагает, что это правда. Поэтому вам нужно будет умножить значение Y на -1. Во-вторых, я подозреваю, что масштаб экрана отличается от масштаба камеры. Я думаю, вы можете исправить масштаб, умножив на (мир/экран).

Допустим, ваш экран имеет ширину = 800, высоту = 600, а ваш мир имеет ширину = 480, высоту = 320. Тогда ваши новые X, Y для вашего спрайта должны быть:

X = Gdx.input.getX()*(480/800)
Y = Gdx.input.getY()*(320/600)*-1
person Doran    schedule 14.11.2011
comment
Зачем вы добавили обратную косую черту перед звездочками? - person HAL9000; 09.03.2014

Вы должны проверить свои сенсорные координаты.

Gdx.app.log("", "hello x"+touchx);
Gdx.app.log("", "hello x"+touchy);

здесь touchx и touchy - ваши входные переменные x и y, затем выполните расчет, где touch должен работать, как если бы вы коснулись x = 100, y = 100

и touchx идет 120 и touch y идет 120

поэтому в вашем методе обновления сделайте это

sprite.setPosition(Gdx.input.getX()-20, Gdx.input.getY()-20);

я думаю это поможет

person sandeep kundliya    schedule 03.10.2013

Я вычислил соотношение размера экрана и игры и умножил его на текущий размер экрана:

rect.x=((((1024/Gdx.graphics.getWidth()))* Gdx.graphics.getWidth())

для ширины экрана 1024 пикселя

Должен быть более простой способ, однако это работает для меня.

person Carl Jackson    schedule 03.06.2014