如何拖放LibGDX Image actor

时间:2014-02-27 07:59:44

标签: java drag-and-drop libgdx

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

我的问题是有效载荷(当它是源演员或单独的演员时)并没有真正被拖拽。相反,有效载荷actor会将自身略微向下放置在鼠标光标的右侧。我想放置有效载荷,而不是指向我想放置有效载荷的位置。它根本不像拖动,感觉就像跟随光标一样。我在Android模拟器上看到的行为与在桌面版应用程序上的行为相同。

2 个答案:

答案 0 :(得分:5)

我开始挖掘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);

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

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);
    }
});

答案 1 :(得分:0)

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

假设您正在使用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中的事件使得你不会收到pan事件,直到光标在你的actor中移动一点,所以在测试时要注意这一点(移动光标只有几个像素不会触发pan事件)。