2013-06-01 3 views
7

Ich mache ein Rennspiel mit Libgdx. Ich möchte die Hälfte der rechten Seite des Bildschirms berühren, um zu beschleunigen, gleichzeitig, ohne vorherigen Berührungspunkt zu entfernen, berühren Sie erneut einen anderen auf der linken Seite des Bildschirms, um einen Schuss abzugeben. Spätere Berührungspunkte kann ich nicht erkennen.Wie verfolgen Sie mehrere Berührungsereignisse in Libgdx?

Ich habe gesucht und Gdx.input.isTouched(int index) Methode bekommen, aber kann nicht bestimmen, wie man es benutzt. Mein Bildschirm Touch-Code ist:

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

Antwort

12

Sie werden die Gdx.input.getX(int index) Methode verwenden möchten. Der ganzzahlige Parameter index repräsentiert die ID eines aktiven Zeigers. Um dies richtig zu nutzen, werden Sie alle möglichen Zeiger durchlaufen müssen (für den Fall, dass zwei Personen 20 Finger auf dem Tablett haben?).

Etwas wie folgt aus:

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! 
} 

Ein alternativer Ansatz zur Einrichtung ist ein InputProcessor Eingabeereignisse zu erhalten (statt „Polling“ der Eingang wie im obigen Beispiel). Und wenn ein Zeiger in einen der Bereiche eindringt, müssten Sie den Zustand des Zeigers verfolgen (so dass Sie ihn löschen könnten, wenn er übrig wäre).

+0

Hallo, vielen Dank für Ihre Antwort. Wenn ich deinen Code benutze, feuere ich den Schuss, entweder ich berühre den Bildschirm oder nicht, aber ich möchte den Schuss nur abfeuern, wenn der Bildschirm sich berührt. –

+4

Ah, vielleicht sollte der Code "Gdx.input.isTouched (i)" vor dem Aufruf von "getX (i)" überprüfen? (Wahrscheinlich ungenutzte Berührungspunkte haben ein X von Null ...). Ich werde den Code aktualisieren. –

+1

Hey, es funktioniert, danke. –