2009-03-15 8 views
8

Ich arbeite an meinem ersten Videospiel für die Android-Plattform als ein paar Nächte und Wochenenden Projekt.Verwenden von TouchScreens für die Spielsteuerung

Es kommt gut voran, aber ich bin sehr unzufrieden mit der Kontrolle Sensitivität.

In diesem Spiel bewegen Sie ein Objekt nach links und rechts auf dem Bildschirm. Auf der Unterseite des Bildschirms ist ein "Touchpad" der Art, wo Ihr Finger ruhen sollte.

/-------------------------\ 
|       | 
|       | 
|       | 
|  Game Area   | 
|       | 
|       | 
|       | 
|       | 
|       | 
/-------------------------\ 
|       | 
|  Touch Area  | 
|       | 
\-------------------------/ 

Ich bin derzeit mit einer Zustandsvariablen „MOVING_LEFT, MOVING_RIGHT, NOT_MOVING“ zu halten und bin die Position des Spielerobjekts jeder Frame auf dieser Variablen basiert aktualisieren.

jedoch mein Code, der die Eingabe Touchscreen liest und setzt diese Zustandsgröße ist entweder zu sensative oder zu laggy, je nachdem, wie ich es zwicken:

public void doTouch (MotionEvent e) { 
    int action = e.getAction(); 

    if (action == MotionEvent.ACTION_DOWN) { 
     this.mTouchX = (int)e.getX(); 
     this.mTouchY = (int)e.getY();   
    } 
    else if (action == MotionEvent.ACTION_MOVE) { 
     if ((int)e.getX() >= this.mTouchX) { 
      this.mTouchX = (int)e.getX(); 
      this.mTouchY = (int)e.getY(); 
      if (this.TouchRect.contains(this.mTouchX, this.mTouchY)) {    
       this.mTouchDirection = MOVING_RIGHT; 
      } 
     } 
     else if ((int)e.getX() <= this.mTouchX) { 
      this.mTouchX = (int)e.getX(); 
      this.mTouchY = (int)e.getY(); 
      if (this.TouchRect.contains(this.mTouchX, this.mTouchY)) {    
       this.mTouchDirection = MOVING_LEFT; 
      } 
     } 
     else { 
      this.mTouchDirection = NOT_MOVING; 
     }    
    } 
    else if (action == MotionEvent.ACTION_UP) { 
     this.mTouchDirection = NOT_MOVING; 
    }  
} 

Die Idee ist, dass, wenn eine Bewegung gibt es Ich überprüfe den vorherigen Standort des Fingers des Benutzers und finde dann heraus, in welche Richtung der Spieler bewegt werden soll.

Dies funktioniert nicht sehr gut, ich denke, es gibt einige IPhone/Android Entwickler hier, die herausgefunden haben, wie man gute Kontrollen über einen Touchscreen macht und einen Rat geben kann.

+0

Können Sie definieren "funktioniert nicht zu gut" und "zu lückig oder zu empfindlich". Eine Beschreibung, wie dies sich verhält, wäre nützlich. –

+0

Zwei empfindliche bedeutet, dass ich meinen Finger einen Zehntel Zoll bewegen und der Spieler ist über den Bildschirm .. zu lückig bedeutet, dass ich meinen Finger über den gesamten Bildschirm bewegen muss, um den Spieler zu bewegen ein Zoll. :) – FlySwat

Antwort

2

Sie könnten etwas ähnliches wie "Ziehen Rechtecke" auf Windows versuchen. Wenn Sie die Maustaste auf etwas gedrückt halten, starten Sie keine Ziehoperation, bis sich die Maus außerhalb einer kleinen Region um die Position mit der Maus nach unten bewegt. Grund ist, dass es sehr schwierig ist, den Cursor beim Klicken auf demselben Pixel zu halten.

So ein erster Versuch könnte (int)e.getX() >= this.mTouchX + DEAD_ZONE und ähnlich für den anderen Fall sein, wo DEAD_ZONE eine kleine ganze Zahl ist.

Dies betrifft jedoch nicht das Drehen im selben Hub. Sie können damit umgehen, indem Sie nur nach links drehen, wenn die aktuelle Position mindestens DEAD_ZONE Pixel links von der letzten Position nach rechts abbiegen, und umgekehrt.

2

Ein offensichtliches Problem ist, dass Sie nirgends die Zeit seit der letzten Berührung berücksichtigen.

Ich würde vorschlagen, behandeln Sie die Spieler berühren als Ausdruck der gewünschten Bewegung auf einem analogen Bereich von -x/+x und -y/+y, dann führen Sie die tatsächliche Bewegung anderswo basierend auf der Zeit.

z.

objectPos += objectPos + (joyPos * timeDelta * maxSpeed); 

Wenn also die max-Geschwindigkeit des Objekts ist 10 ms-1 und der Spieler Finger bei 0,5 auf der Bedienfläche dann würde das Objekt bewegt 5 Meter pro Sekunde. Wenn Ihr Spiel mit 10 fps läuft, würde sich das Objekt in jedem Frame um 0,5 m bewegen.

Diese Zahlen sind fiktiv, aber zeigen hoffentlich die Notwendigkeit, die Kontrolle von der Bewegung zu trennen und dann die Zeit zu berücksichtigen.

Verwandte Themen