繁体   English   中英

拖动libgdx闪烁

[英]dragging in libgdx flickers

我想在LibGDX Mouse拖动一个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围绕它得到更坏。 我们的想法是保留最后两个Mouse位置并使用它们之间的差异来更新Actor的位置。

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

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

  • 在触地时,触摸对象本地坐标中的点L:
    • G:= L.
  • 在触摸移动时,在对象本地坐标中触摸点L:
    • setPosition(toGlobal(L) - toGlobal(G)+ getPosition())

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM