【问题标题】:Drag And Drop LibGDX拖放 LibGDX
【发布时间】:2013-07-25 11:11:44
【问题描述】:

我想制作一款游戏,您可以在其中通过将对象拖放到位来构建东西。我认为 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 引擎)。

提前致谢

【问题讨论】:

    标签: java drag-and-drop draggable libgdx


    【解决方案1】:

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

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

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

    不过,这有点恶心。我认为您最好只进行相对重新定位。不要尝试使用setPosition 绝对定位砖块,只需相对重新定位它:

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

    那么“原点”在哪里并不重要。

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

    【讨论】:

    • 非常感谢!仅作记录,这是最终代码:codeim.addListener((new DragListener() { public void touchDragged (InputEvent event, float x, float y, int pointer) { float dx = x-im.getWidth() *0.5f; float dy = y-im.getHeight()*0.5f; im.setPosition(im.getX() + dx, im.getY() + dy); } }));
    【解决方案2】:

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

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

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

    这里是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 代码即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多