5

私は libgdx フォーラムでこれを尋ねましたが、応答がなかったので、皆さんが私を助けてくれることを望んでいました:

ゲームのピースを表すアクタがあります。私がやろうとしているのは、プレイヤーがタイルをクリックしてドラッグして画面上を移動し、placeTile コマンドを送信する前に複数回回転できるようにすることです。DragAndDrop について私が理解していることから、私のユースケースを念頭に置いて設計されていないように見えるので、代わりに各ゲームピースに dragListener リスナーをアタッチすることにしました (以下のコード)。「ドラッグ開始前の最小距離」を0に設定する方法がわからないことを除いて、ドラッグにはうまく機能します...しかし、それは私の主な質問ではありません(ただし、洞察をいただければ幸いです)

とにかく、アクターを回転させてからドラッグしようとすると、大きな問題が発生します: 30 度の回転では、ドラッグはほとんど通常のように動作します: 60 度では、マウスの非常に小さな動きにより、アクターが非常に狭い円で移動します。早く。さらに 30 度進むと、タイル アクターは 1 ~ 2 フレームで画面から出て、広い弧を描いて移動します。アクターを時計回りに回転させると、動きは時計回りになります。反時計回りも同じパターン。

アクターの移動は回転を考慮しているようです。私の質問は、回転が将来の翻訳に影響を与えずにアクター/グループを回転させることは可能ですか? または、タッチ/マウス入力に基づいて画面上でアクタをドラッグするより良い方法はありますか? 以下にいくつかのコードを含めました。基本的なことを台無しにしていると思いますが、何がわかりません。

// 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 に答える