2013-06-04 14 views
5

Ho chiesto questo al forum libgdx, ma non ha ottenuto una risposta quindi speravo y'all mi potrebbe aiutare:Scene2d - ruotato attore non tradotte come previsto

Ho attori che rappresentano pezzi del gioco. Quello che sto cercando di fare è farlo in modo che il giocatore possa fare clic e trascinare la tessera per spostarla sullo schermo e ruotarla più volte prima di inviare il comando placeTile. Da quanto ho capito di DragAndDrop, non sembra essere stato progettato pensando al mio caso d'uso, quindi ho pensato di collegare un ascoltatore dragListener a ogni pezzo di gioco (codice sotto). Funziona bene per il trascinamento, tranne che non riesco a capire come impostare la 'distanza minima prima che la resistenza inizi' a 0 ... ma questa non è la mia domanda principale (anche se eventuali approfondimenti sarebbero apprezzati)

In ogni caso, il il grosso problema arriva quando ruoto l'attore, e poi provo a trascinarlo: con una rotazione di 30 gradi, il trascinamento si comporta quasi come normale: a 60 gradi, i movimenti molto piccoli del mouse mandano l'attore a muoversi molto velocemente in un cerchio ristretto. Altri 30 gradi, l'attore tessera esce dallo schermo in 1-2 fotogrammi, muovendosi in un ampio arco. Se l'attore viene ruotato in senso orario, i suoi movimenti sono in senso orario; stesso motivo per antiorario.

Sembra che la traduzione dell'attore stia prendendo in considerazione la rotazione; Credo che la mia domanda sia: è possibile ruotare un attore/gruppo senza che la rotazione influenzi le traduzioni future? In alternativa, c'è un modo migliore per trascinare un attore sullo schermo in base all'input touch/mouse? Ho incluso un codice di seguito: immagino che sto strizzando qualcosa di fondamentale, ma non riesco a capire che cosa:

// 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); 
     } 

    }); 

E per l'ascoltatore che si occupa di rotazione tramite scorrimento rotella del mouse:

multiplexer.addProcessor(new InputAdapter() { 
    @Override 
    public boolean scrolled(int amt) { 
     if (chosenTileActor == null) 
      return false; 
     else 
      chosenTileActor.rotate(amt * 30); 
     return true; 

    } 
    }); 

Eventuali puntatori? Sto forse andando nella giusta direzione usando DragListener?

Grazie per la lettura!

risposta

7

invece di tradurre, è sufficiente impostare la posizione dell'attore direttamente alle coordinate fase del vostro evento di trascinamento:

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); 
    } 
}); 

Sto calcolando gli offset in dragStart in modo che l'attore non saltare subito alle ovunque io ho cliccato quando ho iniziato a trascinare (rendendo le drags relative al mio mouse). Testato questo e funziona con qualsiasi rotazione.

+1

Questo ha funzionato perfettamente, grazie! –

+0

Osserva il metodo 'setTapSquareSize'. Se lo desideri, impostalo su 0F. – Alexmelyon

Problemi correlati