Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 拖放LibGDX_Java_Drag And Drop_Draggable_Libgdx - Fatal编程技术网

Java 拖放LibGDX

Java 拖放LibGDX,java,drag-and-drop,draggable,libgdx,Java,Drag And Drop,Draggable,Libgdx,我想做一个游戏,你可以通过拖放物体来构建东西。我认为LibGDX只支持DragNDrop-on-Actors,但我需要砖块上的物理特性,以便在结构不稳定时使砖块倒塌 到目前为止,我的拖放方法是: for(Brick b : map.getList()){ final Image im = new Image(b.ar); stage.addActor(im); im.setPosition(b.posX, b.posY); im

我想做一个游戏,你可以通过拖放物体来构建东西。我认为LibGDX只支持DragNDrop-on-Actors,但我需要砖块上的物理特性,以便在结构不稳定时使砖块倒塌

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

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.getList包含所有要绘制的砖。b、 ar是要绘制的纹理

有了这一套,就会发生什么。我不知道是什么原因造成的

@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的box 2d引擎一起掉落


提前感谢

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

原点用于定义对象的中心,因此当您重新定位它时,Libgdx知道要将角色的哪个部分放置在哪里。一般来说,原点要么是对象的左下角,我认为这是默认值,要么是对象的中心

我猜您可能需要重置原点,因此如果有人点击砖的左边缘,然后重新定位对象,您将重新定位砖上的该点,而不是重新定位砖的左下角。为此,需要将屏幕坐标转换为演员空间中的坐标

不过这些都有点恶心。我认为你最好只是做相对的重新定位。与其尝试使用setPosition绝对定位砖块,不如相对地重新定位砖块:

im.setPosition(im.getX() + dx, im.getY() + dy);
那么原点在哪里就不重要了


您必须根据上一个接触点计算侦听器中的dx和dy。

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

原点用于定义对象的中心,因此当您重新定位它时,Libgdx知道要将角色的哪个部分放置在哪里。一般来说,原点要么是对象的左下角,我认为这是默认值,要么是对象的中心

我猜您可能需要重置原点,因此如果有人点击砖的左边缘,然后重新定位对象,您将重新定位砖上的该点,而不是重新定位砖的左下角。为此,需要将屏幕坐标转换为演员空间中的坐标

不过这些都有点恶心。我认为你最好只是做相对的重新定位。与其尝试使用setPosition绝对定位砖块,不如相对地重新定位砖块:

im.setPosition(im.getX() + dx, im.getY() + dy);
那么原点在哪里就不重要了


您必须根据上一个接触点计算侦听器中的dx和dy。

拖动侦听器似乎给出了相对于引发事件的参与者原点的坐标。这有点奇怪,因为原点一直在变化,所以当您根据拖动事件移动该参与者时。从本质上说,我发现如果我只是按事件的x和y值移动参与者,它将跟随鼠标或手指

一项改进是记录拖动开始的位置,并将其用作偏移,以便指针与参与者原点保持相同的距离

另一个选项可能是将侦听器添加到stage,而不是按钮。我希望坐标会相对于舞台的原点,而原点不会改变。我还没试过那种技巧

下面是水平拖动按钮的步骤:

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代码。

拖动侦听器似乎给出了相对于引发事件的参与者原点的坐标。这有点奇怪,因为原点一直在变化,所以当您根据拖动事件移动该参与者时。从本质上说,我发现如果我只是按事件的x和y值移动参与者,它将跟随鼠标或手指

一项改进是记录拖动开始的位置,并将其用作偏移,以便指针与参与者原点保持相同的距离

另一个选项可能是将侦听器添加到stage,而不是按钮。我希望坐标会相对于舞台的原点,而原点不会改变。我还没试过那种技巧

下面是水平拖动按钮的步骤:

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代码。

非常感谢!这是最后的代码:codeim.addListenernew DragListener{public void touchDraged InputEvent,float x,float y,int pointer{float dx=x-im.getWidth*0.5f;float dy=y-im.getHeight*0.5f;im.setPositionim.getX+dx,im.getY+dy;};谢谢!这是最后的代码:codeim.addListenernew DragListener{public void touchDraging input偶数 t事件,float x,float y,int指针{float dx=x-im.getWidth*0.5f;float dy=y-im.getHeight*0.5f;im.setPositionim.getX+dx,im.getY+dy;};