gpt4 book ai didi

java - 拖入 libgdx 闪烁

转载 作者:行者123 更新时间:2023-12-02 06:13:50 26 4
gpt4 key购买 nike

我想用 LibGDX 中的鼠标拖动一个Actor。我的代码:

// 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的次数越多,情况就越糟糕。这个想法是保留最后两个鼠标位置,并使用它们之间的差异来更新Actor的位置。

最佳答案

任何像这样的增量都会遭受舍入错误。此外,我认为你不需要每帧都更新 prevTouchPosition ;在没有舍入误差的情况下,它不应该改变。请注意,您的代码仅在对象未旋转或缩放时才有效。

更强大的拖动算法的工作原理如下:

  • 触地后,触摸点 L 在物体局部坐标中:
    • G := L
  • 触摸移动时,触摸点 L 在对象局部坐标中:
    • setPosition(toGlobal(L) - toGlobal(G) + getPosition())

请注意,我们在拖动操作期间从不更新 G;它用于记住对象上被“抓取”的点,并且我们不断对齐对象,使该点位于当前触摸之下。这里,toGlobal(L) - toGlobal(G) 为您提供全局坐标中的“delta” vector ,我们将其添加到当前位置。

请注意,我假设没有对象层次结构,因此当前位置本身位于全局坐标中。否则,您还需要考虑父级的转换。

关于java - 拖入 libgdx 闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21653599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com