我想用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的位置。

最佳答案

像这样的增量将遭受舍入错误。而且,我认为您不需要每帧都更新prevTouchPosition;在没有舍入错误的情况下,它不应更改。请注意,您的代码仅在对象未旋转或缩放的情况下有效。

一种更强大的拖动算法如下工作:


按下后,在对象局部坐标中的触摸点L:

G:= L

触摸移动时,对象本地坐标中的触摸点L:

setPosition(toGlobal(L)-toGlobal(G)+ getPosition())



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

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

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

10-09 09:04