2016-10-11 3 views
1

タッチドラッグで移動したい俳優があります。InputListener.touchDraggedに一貫性のない(点滅する)マウス座標

class Tile extends Actor { 
    Tile (char c) { 
     addListener(new InputListener() { 
      private float prevX, prevY; 

      @Override 
      public void touchDragged (InputEvent event, float x, float y, int pointer) { 
       Gdx.app.log(TAG, "touchDrag: (" + x + "," + y); 
       Tile cur = (Tile)event.getTarget(); 
       cur.setPosition( //this call seems to cause the problem 
         cur.getX() + (x - prevX), 
         cur.getY() + (y - prevY)); 
       prevX = x; prevY = y; 
      } 
     }); 
    } 

    @Override 
    public void draw(Batch batch, float alpha) { 
     batch.draw(texture, getX(), getY()); 
    } 

} 

ドラッグとタッチの約半分の速度を移動させながらshuddersのタイル一種。

I/Tile: touchDrag: (72.99997,78.99994) 
I/Tile: touchDrag: (65.99997,70.99994) 
I/Tile: touchDrag: (61.99997,64.99994) 
I/Tile: touchDrag: (55.99997,58.99994) 
I/Tile: touchDrag: (51.99997,52.99994) 
I/Tile: touchDrag: (42.99997,45.99994) 
:私はコメント行(つまり、俳優の位置をリセットしません)、ドラッグ出力がはるかに合理的なルックスを削除した場合

I/Tile: touchDrag: (101.99991,421.99994) 
I/Tile: touchDrag: (112.99985,429.99994) 
I/Tile: touchDrag: (101.99991,426.99994) 
I/Tile: touchDrag: (112.99985,433.99994) 
I/Tile: touchDrag: (101.99991,429.99994) 
I/Tile: touchDrag: (112.99985,436.99994) 

:これは、次のような座標を出力し、ロギングラインによって確認されました

アイデア見てくれてありがとう!

答えて

3

InputListenerメソッドの座標は、アクタの位置に関連して与えられているため、アクタを同時に動かしている場合は、以前の値と比較できません。

代わりに、元の位置を保存し、それに対して移動します。数学はあなたの動きに対応するために動きます:

addListener(new InputListener() { 
     private float startX, startY; 

     @Override 
     public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { 
      startX = x; 
      startY = y; 
      return true; 
     } 

     @Override 
     public void touchDragged (InputEvent event, float x, float y, int pointer) { 
      Tile cur = (Tile)event.getTarget(); 
      cur.setPosition(
        cur.getX() + (x - startX), 
        cur.getY() + (y - startY)); 
     } 
    }); 
+0

ありがとうございます!魅力のように働いた。この事実は[InputListener](https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/scenes/scene2d/InputListener.html)のドキュメントには表示されません。この事実がどこに文書化されているか知っていますか? – sam

+2

ドキュメントに記載されていないように見えます。 scene2d座標は常にローカルアクタの座標系で与えられることを覚えておいてください。 – Tenfour04

関連する問題