2013-07-25 39 views
2

我想製作一個遊戲,你可以通過拖放物體來創建東西。我認爲LibGDX只支持Actor上的DragNDrop,但如果構造不穩定,我需要磚塊上的物理才能使它們掉下來。拖放LibGDX

到目前爲止,我的做法拖放是:

for(Brick b : map.getList()){ 

     final Image im = new Image(b.ar); 

     stage.addActor(im); 
     im.setPosition(b.posX, b.posY); 
     im.setOrigin(b.posX, b.posY); 

     im.addListener((new DragListener() { 
      public void touchDragged (InputEvent event, float x, float y, int pointer) { 
        im.setOrigin(x, y); 
        im.setPosition(x, y); 
        //System.out.println("touchdragged ---> X=" + x + " , Y=" + y); 


       } 

      })); 
    } 

其中map.getLists包含了所有的磚被塗。 b.ar是要塗的紋理。

有了這個aparach [this]是發生了什麼事情。我不知道可能是什麼原因造成的。

@Override 
public void render(float delta) { 
    spritebatch.begin(); 
     map.getWorld().step(1/60f, 6, 2); 
     renderer.render(map.getWorld(), camera.combined); 

     if(Gdx.input.justTouched()){ 
      Vector3 touchPoint = new Vector3(Gdx.input.getX(), Gdx.input.getY(),0); 
      camera.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0)); 

      System.out.println(touchPoint); 
     } 


     stage.draw(); 
    spritebatch.end(); 
} 

當然,我想使身體下降(從libgdx盒2D引擎),如果你刪除的對象,並將其下設什麼。

在此先感謝

回答

4

你在你的聽衆回調設置原點到屏幕座標。這是行不通的。

原點用於定義對象的「中心」,因此當您重新定位對象時,Libgdx知道要將哪個部分放到哪裏。一般來說,原點或者是對象的左下角(我認爲這是默認設置),或者是對象的中心。

我想你可能需要重置原點,所以如果有人點擊磚塊的左邊緣,然後重新定位對象,您將重新定位磚塊上的該點(而不是重新定位磚塊的左下角)。爲此,您需要將屏幕座標轉換爲演員空間中的座標。

雖然這一切都有些蹊蹺。我認爲你做相對重新定位會更好。而不是試圖磚絕對定位與只是將其重新定位比較:

im.setPosition(im.getX() + dx, im.getY() + dy); 

那麼不要緊這裏的「原產地」是。

您必須根據先前的觸點在您的偵聽器中計算dx和dy。

+1

非常感謝!只是爲了記錄這是最後的代碼:'code'im.addListener((新DragListener(){ \t \t \t公共無效touchDragged(InputEvent的事件,浮法X,浮法Y,INT指針){ \t \t \t \t浮動DX = X-im.getWidth()* 0.5F; \t \t \t \t浮子DY = Y-im.getHeight()* 0.5F; \t \t im.setPosition(im.getX()+ DX,im.getY ()+ dy); \t \t \t} \t \t \t})); – yafrack

0

看起來,拖拽監聽器給出了相對於引發事件的actor的原點的座標。當你爲了響應拖動事件而移動該演員時,這有點奇怪,因爲原點不斷變化。基本上,我發現如果我只是通過事件的x和y值來移動actor,它將會跟隨鼠標或手指。

一個改進是記錄拖動開始的位置並將其用作偏移量,因此指針與演員的原點保持相同的距離。

另一種選擇可能是將偵聽器添加到舞臺而不是按鈕。我預計座標將與舞臺的原點相關,而原點不變。我還沒有嘗試過這種技術。

這裏的the code I used到水平拖動按鈕:

DragListener dragListener = new DragListener() { 
    private float startDragX; 

    @Override 
    public void dragStart(
      InputEvent event, 
      float x, 
      float y, 
      int pointer) { 
     startDragX = x; 
    } 

    @Override 
    public void drag(InputEvent event, float x, float y, int pointer) { 
     insertButton.translate(x - startDragX, 0); 
    } 
}; 
dragListener.setTapSquareSize(2); 
insertButton.addListener(dragListener); 

如果你想拖東西兩個維度,只複製X代號爲y位置。