我在 libgdx 论坛上问过这个问题,但没有得到回复,所以我希望大家能帮助我:
我有代表游戏片段的 Actor。我想要做的是让玩家可以单击并拖动图 block 以在屏幕上移动它并在提交 placeTile 命令之前多次旋转它。据我对 DragAndDrop 的了解,它的设计似乎并没有考虑到我的用例,所以我想我应该为每个游戏片段附加一个 dragListener 监听器(下面的代码)。它适用于拖动,除了我不知道如何将“拖动开始前的最小距离”设置为 0...但这不是我的主要问题(尽管有任何见解将不胜感激)
无论如何,当我旋转 actor 然后尝试拖动它时出现了大问题:旋转 30 度时,拖动几乎与正常情况一样:旋转 60 度时,鼠标的非常小的移动会使 actor 移动紧圈很快。再倾斜 30 度,瓦片 Actor 在 1-2 帧内退出屏幕,以宽弧线移动。如果 Actor 顺时针旋转,它的运动就是顺时针的;逆时针方向相同。
看来 Actor 的翻译考虑到了轮换;我想我的问题是,是否可以在不影响 future 翻译的情况下轮换 Actor /组?或者,是否有更好的方法根据触摸/鼠标输入在屏幕上拖动 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 朝着正确的方向前进吗?
感谢阅读!
最佳答案
无需平移,只需将 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
中的偏移量,这样 Actor 就不会在我开始拖动时立即跳到我点击的任何地方(使拖动相对于我的鼠标)。对此进行了测试,它适用于任何旋转。
关于java - Scene2d - 旋转 Actor 未按预期翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16922667/