5

我在 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 走向正确的方向吗?

谢谢阅读!

4

1 回答 1

7

无需平移,只需将演员的位置直接设置为拖动事件的舞台坐标:

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以便演员在我开始拖动时不会立即跳转到我单击的任何位置(相对于我的鼠标进行拖动)。对此进行了测试,它适用于任何旋转。

于 2013-06-05T04:40:05.433 回答