2013-07-25 3 views
2

Я хочу создать игру, в которой вы можете создавать вещи, перетаскивая объекты на место. Я думаю, что LibGDX поддерживает DragNDrop только для актеров, но мне нужна физика на кирпичах, чтобы они падали, если конструкция нестабильна.Drag And Drop 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 - текстура для окрашивания.

С этим aproach [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(); 
} 

Конечно я хотел бы сделать тело упало (с коробкой 2d двигателя от libgdx), если вы уронили объект, и это не имеет ничего под ним.

Заранее спасибо

ответ

4

Вы установка происхождения в вашем слушателе обратного вызова на экран координат. Это не сработает.

Происхождение используется для определения «центра» вашего объекта, поэтому, когда вы его перемещаете, Libgdx знает, какую часть актера поставить туда. Как правило, начало координат - либо нижний левый угол объекта (я думаю, что это значение по умолчанию), либо его центр объекта.

Возможно, вы захотите сбросить исходное положение, чтобы кто-то нажал на левый край кирпича, а затем вы переместите объект, который вы переместите эту точку на кирпич (и не переместите нижний левый угол кирпича). Для этого вам нужно будет преобразовать координаты экрана в координаты в пространстве актера.

Это все немного нехорошо. Я думаю, вам будет лучше просто сделать относительное перемещение. Вместо того, чтобы пытаться позиционировать кирпич абсолютно с просто переставить его относительно:

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

Тогда не имеет значения, где «происхождения».

Вам нужно будет вычислить dx и dy в своем слушателе на основе предыдущей точки касания.

+1

Большое спасибо! Только для записи это окончательный код: 'code'im.addListener ((новый DragListener() { \t \t \t общественного недействительного touchDragged (InputEvent события, поплавок х, поплавок у, внутр указатель) { \t \t \t \t поплавок дх = х-im.getWidth() * 0.5f; \t \t \t \t поплавка ду = у-im.getHeight() * 0.5f; \t \t im.setPosition (im.getX() + дх, im.getY() + dy) \t \t \t \t \t \t})); – yafrack

0

Похоже, что прослушиватель перетаскивания дает координаты относительно начала актера, который поднимает событие. Это немного странно, когда вы перемещаете этого актера в ответ на события перетаскивания, потому что происхождение продолжает меняться. По сути, я обнаружил, что если я просто перемещу актера по значениям x и y события, он будет следовать за мышью или пальцем.

Одним из улучшений является запись положения, в котором началось перетаскивание, и использовать его как смещение, поэтому указатель остается на том же расстоянии от начала актера.

Другим вариантом может быть добавление слушателя на сцену вместо кнопки. Я ожидаю, что координаты будут относиться к происхождению сцены, которая не меняется. Я не пробовал эту технику.

Вот 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); 

Если вы хотите перетащить что-то в двух измерениях, просто скопируйте й код позиции у.