我在libgdx论坛上问了这个问题,但没有得到答复,所以我希望你们都能帮助我:
我有代表游戏片段的演员。我正在尝试做的是让玩家可以点击并拖动磁贴在屏幕上移动它并在提交placeTile命令之前多次旋转它。根据我对DragAndDrop的理解,它似乎并没有考虑到我的用例,所以我想我会将dragListener监听器附加到每个游戏块(下面的代码)。它适用于拖动,除了我无法弄清楚如何将“拖动开始前的最小距离”设置为0 ...但这不是我的主要问题(尽管任何见解都会受到赞赏)
无论如何,当我旋转演员,然后尝试拖动它时出现了一个大问题:在30度旋转时,拖动动作几乎像正常一样:在60度时,鼠标的非常小的移动会让演员移动到紧紧的圈子很快。另外30度,瓷砖演员以1-2帧退出屏幕,以宽弧形移动。如果演员顺时针旋转,它的动作是顺时针方向;逆时针方向相同。
看起来演员的翻译正在考虑轮换;我想我的问题是,是否可以旋转一个Actor / Group,而旋转不会影响未来的翻译?或者,是否有更好的方法根据触摸/鼠标输入在屏幕上拖动Actor?我在下面列出了一些代码:我想我搞砸了一些基本的东西,但我无法弄明白:
// during initial stage creation
tileActor.setOrigin(tileActor.getWidth() / 2, tileActor.getHeight() / 2);
tileActor.addListener(new DragListener() {
public void dragStart(InputEvent event, float x, float y,
int pointer) {
chosenTileActor = event.getTarget();
}
public void drag(InputEvent event, float x, float y, int pointer) {
Actor target = event.getTarget();
target.translate(x, y);
}
});
对于通过滚动鼠标滚轮来处理旋转的听众:
multiplexer.addProcessor(new InputAdapter() {
@Override
public boolean scrolled(int amt) {
if (chosenTileActor == null)
return false;
else
chosenTileActor.rotate(amt * 30);
return true;
}
});
任何指针?我是否通过使用DragListener走向了正确的方向?
感谢阅读!
答案 0 :(得分:7)
不是翻译,而是直接将actor的位置设置为拖动事件的舞台坐标:
tileActor.addListener(new DragListener() {
private float offsetX, offsetY;
@Override
public void dragStart(InputEvent event, float x, float y, int pointer) {
Actor target = event.getTarget();
this.offsetX = event.getStageX() - target.getX();
this.offsetY = event.getStageY() - target.getY();
}
@Override
public void drag(InputEvent event, float x, float y, int pointer) {
event.getTarget().setPosition(event.getStageX() - offsetX, event.getStageY() - offsetY);
}
});
我正在计算dragStart
中的偏移量,这样当我开始拖动时(相对于我的鼠标制作拖动),演员不会立即跳转到我点击的任何地方。经过测试,它适用于任何旋转。