Я пытаюсь реализовать движение камеры, в основном перетаскивая игровой мир пальцем (как перетаскивание карт Google).
Это алгоритм, который я придумал:
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
prevPoint.set(screenX - Gdx.input.getDeltaX(), screenY - Gdx.input.getDeltaY(), 0); //calculate previous finger position (in screen coords)
point.set(screenX, screenY, 0); //set the new coords
camera.unproject(prevPoint);
camera.unproject(point);//unprojecting from screen into word coords
point.sub(prevPoint); //calculate the difference between the two points
camera.translate(-point.x, -point.y, 0); //moving camera by the difference
return true;
}
Я в основном перевожу камеру по разнице между двумя точками мира, поэтому камера перемещается на то же расстояние, что и мой палец (но в противоположном направлении).
К сожалению, это создает очень неровное движение с плохой точностью.
Я попробовал небольшой трюк и предоставил свои собственные значения дельты вместо значений Gdx.input. Я обнаружил, что мой алгоритм работает намного лучше, когда я не использую Gdx.input.getDeltaX () и Gdx.input.getDeltaY () .
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
prevPoint.set(screenX, screenY, 0); //set previous point on touch down event
return true;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
point.set(screenX, screenY, 0); //set coordinates
camera.unproject(prevPoint); //unproject coords
camera.unproject(point);
point.sub(prevPoint); //calc difference
camera.translate(-point.x, -point.y, 0); //translate camera
prevPoint.set(screenX, screenY, 0); //store screen coords to be used in next event as previous coords
return true;
}
По какой-то причине эти методы дают мои разные значения, а не мои собственные значения дельты.
Что я делаю не так? Как правильно использовать эти странные значения?