2

我想制作一个游戏,您可以通过将对象拖放到适当的位置来构建东西。我认为 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 的 box 2d 引擎)。

提前致谢

4

2 回答 2

4

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

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

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

不过,这有点恶心。我认为您最好只进行相对重新定位。而不是尝试通过setPosition相对重新定位砖块来绝对定位砖块:

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

那么“起源”在哪里并不重要。

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

于 2013-07-26T17:49:53.327 回答
0

似乎拖动侦听器给出了相对于引发事件的演员原点的坐标。当您移动那个演员以响应拖动事件时,这有点奇怪,因为原点不断变化。本质上,我发现如果我只是通过事件的 x 和 y 值移动演员,它将跟随鼠标或手指。

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

另一种选择可能是将侦听器添加到舞台而不是按钮。我希望坐标将相对于舞台的原点,这不会改变。我没有尝试过这种技术。

这是我用来水平拖动按钮的代码:

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

于 2014-05-12T05:21:44.593 回答