Java 拖放LibGDX
我想做一个游戏,你可以通过拖放物体来构建东西。我认为LibGDX只支持DragNDrop-on-Actors,但我需要砖块上的物理特性,以便在结构不稳定时使砖块倒塌 到目前为止,我的拖放方法是: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
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;};