Libgdx 拖动纹理(不跳跃)

Libgdx 拖动纹理(不跳跃),libgdx,drag,spritebatch,Libgdx,Drag,Spritebatch,如何拖动纹理(图像),而不使其跳跃并将其自身居中于鼠标光标上(我的代码中有以下内容) 当我点击纹理时,什么也不会发生,当我拖动时,鼠标光标应该保持在原位(相对于纹理的边缘) 例如: 你为什么要用照相机。取消投影 试试这个: Override public void render () { Gdx.gl.glClearColor(1, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.setProjecti

如何拖动纹理(图像),而不使其跳跃并将其自身居中于鼠标光标上(我的代码中有以下内容)

当我点击纹理时,什么也不会发生,当我拖动时,鼠标光标应该保持在原位(相对于纹理的边缘)

例如:


你为什么要用照相机。取消投影

试试这个:

Override
public void render () {
    Gdx.gl.glClearColor(1, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    batch.draw(texture, spritePosition.x, spritePosition.y);
    batch.end();

    if (Gdx.input.isTouched()) {
        spritePosition.set(Gdx.input.getX() - texture.getWidth() / 2, Gdx.input.getY() + texture.getHeight() / 2, 0);
    }

}

你需要做的是计算出鼠标位置相对于你的图像的偏移量,然后减去它,而不是你现在所做的宽度/高度的一半

这里有一些非常粗略的伪代码来说明我的意思-您需要重写为Java

if Gdx.input.justTouched {
    get mouse position from Gdx.input
    camera.unproject it into cameraX and cameraY
    offsetX = cameraX - imageX
    offsetY = cameraY - imageY
}

if Gdx.input.isTouched {
    spritePisition.set(Gdx.input.getX() - offsetX, Gdx.input.getY - offsetY)
}

鼠标位置在物理(即屏幕像素)坐标中,因此他应该使用camera.unproject将其转换为逻辑坐标。即使他从未移动过相机?是的。不同的坐标系。然后用相机位置偏移精灵的位置。这根本不是改变相机位置。阅读视口等。我编辑了我的代码以匹配您的答案。但我得到了一半的结果:)请检查这个更新的gif:y轴是反转的,因为物理坐标系与逻辑坐标系不同(一个是y向下,另一个是y向上)。使用camera.unproject(应该可以修复它)或从屏幕高度减去最终的y位置,以有效地反转它。
if Gdx.input.justTouched {
    get mouse position from Gdx.input
    camera.unproject it into cameraX and cameraY
    offsetX = cameraX - imageX
    offsetY = cameraY - imageY
}

if Gdx.input.isTouched {
    spritePisition.set(Gdx.input.getX() - offsetX, Gdx.input.getY - offsetY)
}