LibGDX:用触摸移动相机
LibGDX: Move camera with Touch
我用 LibGDX
创建了一个 2D android 游戏,我使用正交相机在世界各地移动。
为了移动相机,玩家应该触摸并拖动屏幕。因此,如果您触摸屏幕并向右拖动,相机应该向左移动。所以它应该就像在画廊中移动缩放图片的部分一样。希望大家关注我。
这是代码:
public class CameraTestMain extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
OrthographicCamera camera;
@Override
public void create () {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
camera = new OrthographicCamera(1280, 720);
camera.update();
}
@Override
public void render () {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
handleInput();
camera.update();
batch.setProjectionMatrix(camera.combined);
batch.begin();
batch.draw(img, 0, 0);
batch.end();
}
public void handleInput() {
// That is my problem
}
}
不知道在handleInput()
方法里面写什么。我知道有一个名为 InputProcessor
的接口,方法是 touchDragged(int x, int y, int pointer)
,您可以在其中处理 Touch Drag,但我不知道如何使用它。
感谢您的想法和帮助。
InputProcessor 是允许您定义在执行某些操作(例如触摸屏)时要执行的操作的界面。
所以第一件事就是在你的 class:
中实现接口
public class CameraTestMain extends ApplicationAdapter implements InputProcessor
然后在 create() 方法中通过调用将 class 设置为 InputProcessor:
//create() method
Gdx.input.setInputProcessor(this);
第二个是实现touchDragged方法。请注意,它的 x 和 y 参数只是 相对于最后一个指针位置 以便获得实际位置指针,您应该将其保存在 touchDown 方法中的某个全局变量中。当然你不需要这里的绝对指针位置,因为你可以 修改 相机位置而不是设置它。
//touchDragged method
public boolean touchDragged(int screenX, int screenY, int pointer) {
camera.position.set(camera.position.x + screenX, camera.position.y + screenY);
记得在render()方法的开头调用camera.update()
!
要获取更多信息,请查看 at this tutorial
这个问题很老了,但是正如 Sierox 所说,接受的答案会让相机飞走,所以这里有另一个解决方案
Gdx.input.getDeltaX()
将 return X 轴上当前指针位置和最后一个指针位置之间的差异。
Gdx.input.getDeltaY()
将 return 当前指针位置与 Y 轴上最后一个指针位置之间的差异。
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
float x = Gdx.input.getDeltaX();
float y = Gdx.input.getDeltaY();
camera.translate(-x,y);
return true;
}
我用 LibGDX
创建了一个 2D android 游戏,我使用正交相机在世界各地移动。
为了移动相机,玩家应该触摸并拖动屏幕。因此,如果您触摸屏幕并向右拖动,相机应该向左移动。所以它应该就像在画廊中移动缩放图片的部分一样。希望大家关注我。
这是代码:
public class CameraTestMain extends ApplicationAdapter {
SpriteBatch batch;
Texture img;
OrthographicCamera camera;
@Override
public void create () {
batch = new SpriteBatch();
img = new Texture("badlogic.jpg");
camera = new OrthographicCamera(1280, 720);
camera.update();
}
@Override
public void render () {
Gdx.gl.glClearColor(1, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
handleInput();
camera.update();
batch.setProjectionMatrix(camera.combined);
batch.begin();
batch.draw(img, 0, 0);
batch.end();
}
public void handleInput() {
// That is my problem
}
}
不知道在handleInput()
方法里面写什么。我知道有一个名为 InputProcessor
的接口,方法是 touchDragged(int x, int y, int pointer)
,您可以在其中处理 Touch Drag,但我不知道如何使用它。
感谢您的想法和帮助。
InputProcessor 是允许您定义在执行某些操作(例如触摸屏)时要执行的操作的界面。
所以第一件事就是在你的 class:
中实现接口 public class CameraTestMain extends ApplicationAdapter implements InputProcessor
然后在 create() 方法中通过调用将 class 设置为 InputProcessor:
//create() method
Gdx.input.setInputProcessor(this);
第二个是实现touchDragged方法。请注意,它的 x 和 y 参数只是 相对于最后一个指针位置 以便获得实际位置指针,您应该将其保存在 touchDown 方法中的某个全局变量中。当然你不需要这里的绝对指针位置,因为你可以 修改 相机位置而不是设置它。
//touchDragged method
public boolean touchDragged(int screenX, int screenY, int pointer) {
camera.position.set(camera.position.x + screenX, camera.position.y + screenY);
记得在render()方法的开头调用camera.update()
!
要获取更多信息,请查看 at this tutorial
这个问题很老了,但是正如 Sierox 所说,接受的答案会让相机飞走,所以这里有另一个解决方案
Gdx.input.getDeltaX()
将 return X 轴上当前指针位置和最后一个指针位置之间的差异。
Gdx.input.getDeltaY()
将 return 当前指针位置与 Y 轴上最后一个指针位置之间的差异。
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
float x = Gdx.input.getDeltaX();
float y = Gdx.input.getDeltaY();
camera.translate(-x,y);
return true;
}