2014-01-25 3 views
9

Я работаю над игрой для Android, используя LIBGDX.Libgdx get scaled touch position

@Override 
public boolean touchDown(int x, int y, int pointer, int button) { 
    // TODO Auto-generated method stub 

    return false; 
} 

Здесь, х и у возвращают позицию прикосновения на экране устройства, а значения между 0 и шириной экрана устройства и высотой.

Мое разрешение игры составляет 800x480, и оно будет поддерживать соотношение сторон на каждом устройстве. Я хочу, чтобы найти способ, чтобы получить сенсорную позицию, связанную с игрой прямоугольника, это изображение может точно объяснить: enter image description here

Есть ли способ сделать это? Я хочу, чтобы получить сенсорную позицию, связанную с моим видовым .. Я использую это, чтобы сохранить пропорции http://www.java-gaming.org/index.php?topic=25685.0

ответ

12

Unproject ваше прикосновение.

Сделать объект Vector3 для пользователя прикосновения:

Vector3 touch = new Vector3(); 

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

@Override 
public boolean touchDown(int x, int y, int pointer, int button){ 

    camera.unproject(touch.set(x, y, 0)); //<--- 

    //use touch.x and touch.y as your new touch point 

    return false; 
} 
+0

Нужно ли снимать все события касания? Я только реализовал его для функции «tap», но не для функции «pan». Кажется, что работает до сих пор, но функция «панорамирования» иногда «перескакивает», может ли это быть вызвано не выводом функции «панорамирования»? –

0

Через 1-2 paintful часов я finnaly нашел решение ..

if (Gdx.input.isTouched()) { 
     float x = Gdx.input.getX(); 
     float y = Gdx.input.getY(); 
     float yR = viewport.height/(y - viewport.y); // the y ratio 
     y = 480/yR; 

     float xR = viewport.width/(x - viewport.x); // the x ratio 
     x = 800/xR; 

     bubbles.add(new Bubble(x, 480 - y)); 

    } 

Редактировать : это устаревший способ сделать это, так что нет.

+1

Что такое видовая область? – ManishSB

7

В новой версии LibGDX вы можете достичь он со встроенными видовыми экранами. Сначала выберите предпочтительный видовой экран, который вы хотите здесь, - FitViewport. Вы можете прочитать о них здесь: https://github.com/libgdx/libgdx/wiki/Viewports
Далее, вы заявляете и инициализировать окно просмотра и передать свое разрешение и камеру:

viewport = new FitViewport(800, 480, cam); 

Затем измените «Изменить размер» метод класса экрана должно быть так:

@Override 
public void resize(int width, int height) { 
    viewport.update(width, height); 

} 

Теперь, когда вы хотите получить точки касания, вам необходимо перенести их в новые точки в соответствии с новым разрешением. К счастью, класс viewport делает это автоматически.

Просто напишите это:

Vector2 newPoints = new Vector2(x,y); 
newPoints = game.mmScreen.viewport.unproject(newPoints); 

где х и у являются точки касания на экране и во второй строке «newPoints» получает преобразованные координаты.
Теперь вы можете передавать их туда, где хотите.

+0

Это сработало отлично! (viewport.unproject) –

+0

Позаботьтесь, я вызывал viewport.getCamera(). unproject .. это неправильно. Вы должны вызвать unproject на самом окне просмотра, а не на камеру просмотра. спасибо – Matteo