2013-06-01 13 views
7

Sto facendo un gioco di corse usando Libgdx. Voglio toccare la metà destra dello schermo per accelerare, allo stesso tempo, senza rimuovere il punto di tocco precedente, toccare di nuovo un altro sul lato sinistro dello schermo per sparare un colpo. Non riesco a rilevare i punti di tocco successivi.Come tenere traccia di più eventi tattili in Libgdx?

Ho cercato e ottenuto il metodo Gdx.input.isTouched(int index), ma non posso determinare come usarlo. Il mio codice touch screen è:

if(Gdx.input.isTouched(0) && world.heroCar.state != HeroCar.HERO_STATE_HIT){ 
    guiCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0)); 
    if (OverlapTester.pointInRectangle(rightScreenBounds, touchPoint.x, touchPoint.y)) { 
     world.heroCar.state = HeroCar.HERO_STATE_FASTRUN; 
     world.heroCar.velocity.y = HeroCar.HERO_STATE_FASTRUN_VELOCITY; 
    } 
} else { 
    world.heroCar.velocity.y = HeroCar.HERO_RUN_VELOCITY; 
} 

if (Gdx.input.isTouched(1)) { 
    guiCam.unproject(touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0)); 
    if (OverlapTester.pointInRectangle(leftScreenBounds, touchPoint.x, touchPoint.y)) { 
     world.shot(); 
    } 
} 

risposta

12

Ti consigliamo di utilizzare il metodo Gdx.input.getX(int index). Il parametro intero index rappresenta l'ID di un puntatore attivo. Per usare correttamente questo, vorrai ripetere tutti i possibili puntatori (nel caso in cui due persone abbiano 20 dita sul tablet?).

Qualcosa di simile a questo:

boolean fire = false; 
boolean fast = false; 
final int fireAreaMax = 120; // This should be scaled to the size of the screen? 
final int fastAreaMin = Gdx.graphics.getWidth() - 120; 
for (int i = 0; i < 20; i++) { // 20 is max number of touch points 
    if (Gdx.input.isTouched(i)) { 
     final int iX = Gdx.input.getX(i); 
     fire = fire || (iX < fireAreaMax); // Touch coordinates are in screen space 
     fast = fast || (iX > fastAreaMin); 
    } 
} 

if (fast) { 
    // speed things up 
} else { 
    // slow things down 
} 

if (fire) { 
    // Fire! 
} 

Un approccio alternativo è quello di impostare un InputProcessor per ottenere eventi di input (invece di "polling" l'ingresso come nell'esempio precedente). E quando un puntatore entra in una delle aree, dovresti monitorare lo stato di quel puntatore (in modo da poterlo cancellare se lasciato).

+0

Ciao, grazie per la risposta. Quando ho usato il tuo codice, spara lo scatto o tocco lo schermo o no, ma voglio sparare solo quando tocco schermo. –

+4

Ah, forse il codice dovrebbe controllare 'Gdx.input.isTouched (i)' prima di invocare 'getX (i)'? (Probabilmente i punti di contatto non utilizzati hanno una X di zero ...). Aggiornerò il codice –

+1

Ehi funziona, grazie. –