我在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);
}
});
Run Code Online (Sandbox Code Playgroud)
对于通过滚动鼠标滚轮处理旋转的听众:
multiplexer.addProcessor(new InputAdapter() {
@Override
public boolean scrolled(int amt) {
if (chosenTileActor == null)
return false;
else
chosenTileActor.rotate(amt * 30);
return true;
}
});
Run Code Online (Sandbox Code Playgroud)
有什么指针吗?我是否通过使用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);
}
});
Run Code Online (Sandbox Code Playgroud)
我正在计算偏移量,dragStart以便当我开始拖动(使拖动相对于我的鼠标)时,演员不会立即跳转到我点击的任何地方.经过测试,它适用于任何旋转.
| 归档时间: |
|
| 查看次数: |
684 次 |
| 最近记录: |