我想在Actor
中使用Mouse
拖动LibGDX
。
我的代码:
// overrides in the ClickListener
@Override
public boolean touchDown(InputEvent event, float x, float y,
int pointer, int button) {
touching = true;
prevTouchPosition = new Vector2(x, y);
return super.touchDown(event, x, y, pointer, button);
}
@Override
public void touchDragged(InputEvent event, float x, float y,
int pointer) {
dragging = true;
lastTouchPosition = new Vector2(x, y);
super.touchDragged(event, x, y, pointer);
}
@Override
public void touchUp(InputEvent event, float x, float y,
int pointer, int button) {
touching = false;
super.touchUp(event, x, y, pointer, button);
}
// the update method
@Override
public void act(float delta) {
super.act(delta);
if(dragging){
Vector2 diff = new Vector2(lastTouchPosition).sub(prevTouchPosition);
translate(diff.x, diff.y);
prevTouchPosition = new Vector2(lastTouchPosition);
dragging = false;
}
}
我移动的Actor
越多越好。
我们的想法是保留最后两个Mouse
位置并使用它们之间的差异来更新Actor
的位置。
答案 0 :(得分:2)
任何像这样增量的东西都会受到舍入错误的影响。此外,我认为您不需要每帧都更新prevTouchPosition
;在没有舍入错误的情况下,它不应该改变。请注意,只有在未旋转或缩放对象时,您的代码才有效。
更强大的拖动算法的工作原理如下:
请注意,我们永远不会在拖动操作期间更新G;它用于记住物体上被“抓住”的点,我们不断对齐物体,使此点在当前触摸下。在这里,toGlobal(L) - toGlobal(G)为您提供全局坐标中的“delta”向量,我们将其添加到当前位置。
请注意,我假设没有对象层次结构,因此当前位置本身就是全局坐标。否则你也需要考虑父变换。