拖放 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。
【讨论】:
非常感谢!仅作记录,这是最终代码:code
im.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的主要内容,如果未能解决你的问题,请参考以下文章