Libgdx 设备中的 GestureDetector 平移方法 slower/faster
Libgdx GestureDetector pan method slower/faster in devices
我在 libgdx 中有一个平铺地图,我正在 class 中实现 GestureDetector pan 方法。
我想要发生的是,当用户使用平移方法时,屏幕被拖动到那个方向,有点像用户用他的手指移动平铺地图。
当我在桌面上测试代码时,拖动非常好,地图以完美的速度和平滑度拖动。
但是当我在不同的 android 设备上测试相同的代码时,拖动要么太慢,要么太快。有时手指的小动作会使地图在整个屏幕上移动。
如何使平移方法在所有设备上保持一致?我的代码:
public class SinglePlayerGame extends GestureDetector.GestureAdapter implements Screen{
private TiledMap map;
private OrthogonalTiledMapRenderer mapRenderer;
private OrthographicCamera camera;
private Viewport viewport;
private Main game;
public SinglePlayerGame(Main game){
this.game = game;
this.camera = new OrthographicCamera();
this.viewport = new StretchViewport(Main.VIRTUAL_WIDTH, Main.VIRTUAL_HEIGHT, camera);
this.map = new TmxMapLoader().load("map_1.tmx");
this.mapRenderer = new OrthogonalTiledMapRenderer(map);
this.camera.position.set(viewport.getWorldWidth() / 2, viewport.getWorldHeight() / 2, 0);
Gdx.input.setInputProcessor(new GestureDetector(this));
resize(Main.VIRTUAL_WIDTH, Main.VIRTUAL_HEIGHT);
}
public boolean pan(float x, float y, float deltaX, float deltaY){
camera.translate(-deltaX, deltaY);
camera.update();
return false;
}
@Override
public void render(float delta){
update();
game.batch.setProjectionMatrix(camera.combined);
game.batch.begin();
game.batch.end();
mapRenderer.render();
}
public void update(){
camera.update();
mapRenderer.setView(camera);
}
@Override
public void resize(int width, int height){
viewport.update(width, height);
}
public void show(){}
public void pause(){}
public void resume(){}
public void hide(){}
@Override
public void dispose(){
}
GestureDetector 单位以屏幕像素为单位,因此您需要将它们缩放到您的世界单位,由您的相机和视口定义:
public boolean pan(float x, float y, float deltaX, float deltaY){
float scaleX = viewport.getWorldWidth() / (float)viewport.getScreenWidth();
float scaleY = viewport.getWorldHeight() / (float)viewport.getScreenHeight();
camera.translate((int)(-deltaX * scaleX), (int)(deltaY * scaleY));
camera.update();
return false;
}
我在 libgdx 中有一个平铺地图,我正在 class 中实现 GestureDetector pan 方法。
我想要发生的是,当用户使用平移方法时,屏幕被拖动到那个方向,有点像用户用他的手指移动平铺地图。
当我在桌面上测试代码时,拖动非常好,地图以完美的速度和平滑度拖动。
但是当我在不同的 android 设备上测试相同的代码时,拖动要么太慢,要么太快。有时手指的小动作会使地图在整个屏幕上移动。
如何使平移方法在所有设备上保持一致?我的代码:
public class SinglePlayerGame extends GestureDetector.GestureAdapter implements Screen{
private TiledMap map;
private OrthogonalTiledMapRenderer mapRenderer;
private OrthographicCamera camera;
private Viewport viewport;
private Main game;
public SinglePlayerGame(Main game){
this.game = game;
this.camera = new OrthographicCamera();
this.viewport = new StretchViewport(Main.VIRTUAL_WIDTH, Main.VIRTUAL_HEIGHT, camera);
this.map = new TmxMapLoader().load("map_1.tmx");
this.mapRenderer = new OrthogonalTiledMapRenderer(map);
this.camera.position.set(viewport.getWorldWidth() / 2, viewport.getWorldHeight() / 2, 0);
Gdx.input.setInputProcessor(new GestureDetector(this));
resize(Main.VIRTUAL_WIDTH, Main.VIRTUAL_HEIGHT);
}
public boolean pan(float x, float y, float deltaX, float deltaY){
camera.translate(-deltaX, deltaY);
camera.update();
return false;
}
@Override
public void render(float delta){
update();
game.batch.setProjectionMatrix(camera.combined);
game.batch.begin();
game.batch.end();
mapRenderer.render();
}
public void update(){
camera.update();
mapRenderer.setView(camera);
}
@Override
public void resize(int width, int height){
viewport.update(width, height);
}
public void show(){}
public void pause(){}
public void resume(){}
public void hide(){}
@Override
public void dispose(){
}
GestureDetector 单位以屏幕像素为单位,因此您需要将它们缩放到您的世界单位,由您的相机和视口定义:
public boolean pan(float x, float y, float deltaX, float deltaY){
float scaleX = viewport.getWorldWidth() / (float)viewport.getScreenWidth();
float scaleY = viewport.getWorldHeight() / (float)viewport.getScreenHeight();
camera.translate((int)(-deltaX * scaleX), (int)(deltaY * scaleY));
camera.update();
return false;
}