拖放LibGDX

时间:2013-07-25 13:55:03

标签: java drag-and-drop draggable libgdx

我想创建一个游戏,您可以通过将对象拖放到位来构建内容。我认为LibGDX只支持Actors上的DragNDrop,但是如果构造不稳定,我需要在砖块上使用物理,以使它们掉落。

到目前为止,我的拖放方法是:

for(Brick b : map.getList()){

        final Image im = new Image(b.ar);

        stage.addActor(im);
        im.setPosition(b.posX, b.posY);
        im.setOrigin(b.posX, b.posY);

        im.addListener((new DragListener() {
            public void touchDragged (InputEvent event, float x, float y, int pointer) {
                    im.setOrigin(x, y);
                    im.setPosition(x, y);
                    //System.out.println("touchdragged ---> X=" + x + "  , Y=" + y);


                }

            }));
    }

其中map.getLists包含要绘制的所有砖块。 b.ar是要绘制的纹理。

有了这个方法[this]就会发生什么。我不知道是什么原因引起的。

@Override
public void render(float delta) {
    spritebatch.begin();
        map.getWorld().step(1/60f, 6, 2);
        renderer.render(map.getWorld(), camera.combined);

        if(Gdx.input.justTouched()){
            Vector3 touchPoint = new Vector3(Gdx.input.getX(), Gdx.input.getY(),0);
            camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0));

            System.out.println(touchPoint);
        }


        stage.draw();
    spritebatch.end();
}

当然我想让身体掉下来(使用libgdx的盒子2d引擎)如果掉落物体并且它下面没有任何东西。

提前致谢

2 个答案:

答案 0 :(得分:4)

您正在将侦听器回调中的原点设置为屏幕坐标。那不行。

原点用于定义对象的“中心”,因此当你重新定位它时,Libgdx知道要放在哪里的actor的哪个部分。通常,原点是对象的左下角(我认为这是默认值)或它是对象的中心。

我猜你可能想要重置原点,所以如果有人点击砖块的左边缘然后重新定位对象,你将重新定位砖块上的那个点(而不是重新定位砖块的左下角) 。要做到这一点,你需要将屏幕坐标转换为演员空间中的坐标。

虽然这有点蠢。我认为你做相对重新定位会更好。而不是试图用setPosition绝对定位砖只是相对地重新定位:

im.setPosition(im.getX() + dx, im.getY() + dy);

然后“起源”的位置无关紧要。

您必须根据之前的触摸点在听众中计算dx和dy。

答案 1 :(得分:0)

看来,拖动侦听器提供相对于引发事件的actor的原点的坐标。当您移动该actor以响应拖动事件时,这有点奇怪,因为原点不断变化。基本上,我发现如果我只是按照事件的x和y值移动actor,它将跟随鼠标或手指。

一个改进是记录拖动开始的位置并将其用作偏移,因此指针与演员的原点保持相同的距离。

另一种选择可能是将监听器添加到舞台而不是按钮。我希望坐标相对于舞台的起源而言是不变的。我还没有尝试过这种技术。

此处the code I used水平拖动按钮:

DragListener dragListener = new DragListener() {
    private float startDragX;

    @Override
    public void dragStart(
            InputEvent event, 
            float x, 
            float y,
            int pointer) {
        startDragX = x;
    }

    @Override
    public void drag(InputEvent event, float x, float y, int pointer) {
        insertButton.translate(x - startDragX, 0);
    }
};
dragListener.setTapSquareSize(2);
insertButton.addListener(dragListener);

如果要在二维中拖动某些内容,只需复制y位置的x代码即可。