拖放 LibGDX

Posted

技术标签:

【中文标题】拖放 LibGDX【英文标题】:Drag And Drop 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 引擎)。

提前致谢

【问题讨论】:

【参考方案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 代码即可。

【讨论】:

以上是关于拖放 LibGDX的主要内容,如果未能解决你的问题,请参考以下文章

HTML 5 拖放 如何判断一个元素是不是接受拖放

整个页面作为拖放区进行拖放

深入理解javascript原生拖放

Angular 7 拖放 - 动态创建拖放区

拖放完成或取消时在拖放源中触发的事件

Javar拖放