【问题标题】:How to drag and drop a LibGDX Image actor如何拖放 LibGDX Image actor
【发布时间】:2014-02-27 07:59:44
【问题描述】:

我有一个带有几个图像(Actor 子类)的 LibGDX 场景。我想将一个图像拖放到另一个图像上。我从位于DragDropTest.java 的源代码开始。因为我基本上希望源是有效负载,所以我尝试修改 payload.setDragActor 以使用源图像。它有点工作,我需要添加代码以将有效负载演员放回舞台,但这不是我的问题。

我的问题是有效载荷(当它是源演员或单独的演员时)并没有真正被拖动。相反,payload actor 将自身定位在鼠标光标的右侧和下方。我想放置有效载荷,而不是指向我想要放置有效载荷的位置。完全没有拖拽的感觉,感觉像是有什么东西在跟着光标移动。我在 Android 模拟器上看到的行为与在桌面版应用程序上看到的行为相同。

【问题讨论】:

    标签: java drag-and-drop libgdx


    【解决方案1】:

    我浏览了 com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop 的 LibGDX 源代码并找到了答案。该代码将有效载荷 +14 放置在光标的 X 方向上,并将 (-20 - payLoadActor.getHeight()) 放置在 Y 方向上,这就是为什么我无法直观地拖动有效载荷的原因。有一个setDragActorPosition 方法可以用来纠正位置。如果您总是希望拖动的有效负载在光标下居中,您可以这样做:

    final DragAndDrop dragAndDrop = new DragAndDrop();
    dragAndDrop.setDragActorPosition(-(sourceImage.getWidth()/2), sourceImage.getHeight()/2);
    

    如果您希望拖动的有效负载保持其在光标/手指下的位置,而不是在 dragStart 方法中调用 setDragActorPosition 时必须使用光标位置。

    final DragAndDrop dragAndDrop = new DragAndDrop();
    dragAndDrop.addSource(new DragAndDrop.Source(sourceImage) {
        public DragAndDrop.Payload dragStart (InputEvent event, float x, float y, int pointer) {
            DragAndDrop.Payload payload = new DragAndDrop.Payload();
            payload.setDragActor(sourceImage);
            dragAndDrop.setDragActorPosition(-x, -y + sourceImage.getHeight());
            return payload;
        }
        public void dragStop (InputEvent event, float x, float y, int pointer, Target target) {
            sourceImage.setBounds(50, 125, sourceImage.getWidth(), sourceImage.getHeight());
            if(target != null) {
                sourceImage.setPosition(target.getActor().getX(), target.getActor().getY());
            }
            virtualStage.addActor(sourceImage);
        }
    });
    

    【讨论】:

    • 我认为有一个小错误 - x 参数上有减号。它应该在 y 参数上:“dragAndDrop.setDragActorPosition(sourceImage.getWidth()/2, -(sourceImage.getHeight()/2))”
    【解决方案2】:

    您没有显示任何代码,因此很难知道您实际在做什么。根据您的描述,听起来您将有效负载放置在光标所在的位置,而不是将其移动到与您开始拖动后光标移动相同的偏移量。

    假设您使用的是 ActorGestureListener,这就是我在我的应用中所做的。

    float touchX, touchY;
    
    public void touchDown(InputEvent ev, float x, float y, int pointer, int button) {
        touchX = x;
        touchY = y;
        ...
    }
    
    public void pan(InputEvent ev, float x, float y, float dx, float dy) {
        moveBy(x - touchX, y - touchY);
        ...
    }
    

    这样你移动你的演员的量与移动鼠标光标的量相同,所以它就像指针“粘”到你触摸你的演员的任何地方。另外,我相信 libgdx 中的事件可以使您不会收到平移事件,直到光标在您的演员内部移动了一点,所以在测试时要注意这一点(仅将光标移动几个像素不会触发平移事件)。

    【讨论】:

    • 正如我所说,我使用的代码是 github.com/libgdx/libgdx/blob/master/tests/gdx-tests/src/com/… 我没有放置任何东西,com.badlogic.gdx.scenes.scene2d.utils.DragAndDrop 应该根据我的理解为我处理这个问题,但这个位置给了演员(有效载荷)随着光标的移动看起来很愚蠢,并且在视觉上与拖动不对应。
    • 我明白你为什么错过了我链接到的源代码,我正在使用 - 有人将我的链接编辑到类名并且很容易错过。
    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2021-03-15
    • 1970-01-01
    • 2015-10-19
    • 2020-12-27
    相关资源
    最近更新 更多