我想创建一个游戏,您可以通过将对象拖放到位来构建内容。我认为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的盒子2d引擎)如果掉落物体并且它下面没有任何东西。
提前致谢
答案 0 :(得分:4)
您正在将侦听器回调中的原点设置为屏幕坐标。那不行。
原点用于定义对象的“中心”,因此当你重新定位它时,Libgdx知道要放在哪里的actor的哪个部分。通常,原点是对象的左下角(我认为这是默认值)或它是对象的中心。
我猜你可能想要重置原点,所以如果有人点击砖块的左边缘然后重新定位对象,你将重新定位砖块上的那个点(而不是重新定位砖块的左下角) 。要做到这一点,你需要将屏幕坐标转换为演员空间中的坐标。
虽然这有点蠢。我认为你做相对重新定位会更好。而不是试图用setPosition
绝对定位砖只是相对地重新定位:
im.setPosition(im.getX() + dx, im.getY() + dy);
然后“起源”的位置无关紧要。
您必须根据之前的触摸点在听众中计算dx和dy。
答案 1 :(得分:0)
看来,拖动侦听器提供相对于引发事件的actor的原点的坐标。当您移动该actor以响应拖动事件时,这有点奇怪,因为原点不断变化。基本上,我发现如果我只是按照事件的x和y值移动actor,它将跟随鼠标或手指。
一个改进是记录拖动开始的位置并将其用作偏移,因此指针与演员的原点保持相同的距离。
另一种选择可能是将监听器添加到舞台而不是按钮。我希望坐标相对于舞台的起源而言是不变的。我还没有尝试过这种技术。
此处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代码即可。