2015-05-31 13 views
6

Ho ruotato il mio sprite di 90 gradi e voglio fare lo stesso con il mio rettangolo per poterli usare per la collisione, ma il metodo rotate() non è disponibile sui rettangoli.Come posso ruotare i rettangoli in Libgdx?

Questo è quello che ho fatto:

treeSpr=new Sprite(new Texture(Gdx.files.internal("tree.png"))); 
     treeSpr.setPosition(250,700); 
     treeSpr.rotate(90f); 

//Rectangle 
treeRect=new Rectangle(treeSpr.getX(),treeSpr.getHeight(), 
       treeSpr.getWidth(),treeSpr.getHeight()); 
+1

Hai provato a usare Box2D? – razzledazzle

+0

Ciao, puoi implementare una tua classe Rect o ... Non so esattamente come hai fatto la rotazione. Ma puoi usare le matrici di rotazione e di traduzione in modo che la collisione possa essere elaborata come se il tuo sprite fosse ancora a 0 gradi e usare il normale rect –

+0

No, non ho ancora provato Box2d, puoi darmi un esempio del codice? scusa sono nuovo allo sviluppo di java e giochi –

risposta

12

L'altra risposta è fondamentalmente corretta; tuttavia, ho avuto alcuni problemi con il posizionamento dei poligoni usando quel metodo. Solo alcuni chiarimenti:

LibGDX non supporta i rettangoli ruotati quando si utilizza l'Intersector per la verifica della collisione. Se avete bisogno di rettangoli ruotati, dovreste usare lo Polygon per il rilevamento delle collisioni.

Costruire un poligono rettangolare:

polygon = new Polygon(new float[]{0,0,bounds.width,0,bounds.width,bounds.height,0,bounds.height}); 

Non dimenticare di impostare l'origine del poligono, se avete intenzione di ruotarlo:

polygon.setOrigin(bounds.width/2, bounds.height/2); 

Ora si può ruotare il poligono di collisione:

polygon.setRotation(degrees); 

Inoltre, da qualche parte nel codice, è probabile che si desideri aggiornare la posizione del collisione poligonale per abbinare il vostro sprite:

polygon.setPosition(x, y); 

Possiamo anche disegnare il nostro poligono sullo schermo (per scopi di debug):

drawDebug(ShapeRenderer shapeRenderer) { 
    shapeRenderer.begin(ShapeRenderer.ShapeType.Line); 
    shapeRenderer.polygon(polygon.getTransformedVertices()); 
    shapeRenderer.end(); 
} 

Collision Detection:

I overlapConvexPolygons() del Intersector:

boolean collision = Intersector.overlapConvexPolygons(polygon1, polygon2) 

Come menzionato nell'altra risposta, questo metodo solo w Orchi se:

  • utilizzando poligoni convessi, che il rettangolo è
  • eseguire poligono per poligono controlli, ad es .: non è possibile mescolare rettangoli e poligoni
+0

Invece di chiamare 'setPosition (x, y)' separatamente, perché non creare correttamente il poligono nella posizione del rettangolo? Vedi il [https://libgdx.badlogicgames.com/nights/docs/api/com/badlogic/gdx/math/Polygon.html#Polygon-float:A-](docs) per il parametro 'float [] vertices' del costruttore. – bal

+0

Ricorda anche che il metodo 'Polygon.setRotation (degrees)' non funzionerà come il metodo 'Sprite.rotate (degrees)'. Il primo imposterà la rotazione indipendentemente dalla rotazione corrente, mentre il secondo aumenterà la rotazione dei gradi specificati. – bal

1

penso che qualcosa di simile può aiutare, non posso provare ora,

//Rectangle 
treeRect=new Rectangle(treeSpr.getX(), 
         treeSpr.getY(), 
         treeSpr.getHeight(), //now is change width by height 
         treeSpr.getWidth()); //now is change height by width 

Nota: potrebbe essere necessario regolare l'origine della rotazione sia per

è possibile utilizzare un rendering ShapeRenderer per vedere se il risultato è come previsto:

aggiungere per il test in classe variabile

private ShapeRenderer sRDebugRectangel = new ShapeRenderer(); 

aggiungere per il test in aggiornare o disegnare

sRDebugRectangel.begin(ShapeType.Filled); 
sRDebugRectangel.identity(); 

sRDebugRectangel.rect(yourRectangle.getX(), 
         yourRectangle.getY(), 
         yourRectangle.getWidth(), 
         yourRectangle.getHeight()); 

sRDebugRectangel.end(); 

può guardare la mia risposta a questa domanda per utilizzare uno shaperrender altrimenti noto come:

Libgdx, how can I create a rectangle from coordinates?

5

rotazione

Si potrebbe creare una Polygon dal rettangolo o dal sprite (fornendo i vertici in modo che il costruttore poligono) e usarlo è rotate(float degrees) metodo:

treePoly = new Polygon(new float[] { 
       treeRect.x, treeRect.y, 
       treeRect.x, treeRect.y + treeRect.height, 
       treeRect.x + treeRect.width, treeRect.y + treeRect.height, 
       treeRect.x + treeRect.width, treeRect.y 
      }); 

treePoly.rotate(45f); 

Collision Detection

I controlli di collisione possono quindi essere eseguiti tramite la classe Intersector:

Intersector.overlapConvexPolygons(polygon1, polygon2) 

Occorre tuttavia tenere presente, questo metodo funziona solo se:

  • si utilizza convex polygons, che il rettangolo è
  • che fate poligono per controlli poligono, ad esempio: non è possibile mescolare rettangoli e poligoni
Problemi correlati