8 Stimmen

Verwendung von TouchScreens zur Spielsteuerung

Ich arbeite an meinem ersten Videospiel für die Android-Plattform, sozusagen als Nacht- und Wochenendprojekt.

Es geht gut voran, aber ich bin sehr unzufrieden mit der Empfindlichkeit der Steuerung.

In diesem Spiel bewegst du ein Objekt nach links und rechts auf dem Bildschirm. Am unteren Rand des Bildschirms befindet sich eine Art "Touchpad", auf dem Ihr Finger ruhen sollte.

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

Ich verwende derzeit eine Zustandsvariable, die "MOVING_LEFT, MOVING_RIGHT, NOT_MOVING" enthält, und aktualisiere die Position des Spielerobjekts bei jedem Frame auf der Grundlage dieser Variablen.

Mein Code, der die Touchscreen-Eingabe liest und diese Zustandsvariable setzt, ist jedoch entweder zu empfindlich oder zu langsam, je nachdem, wie ich ihn optimiere:

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 ich bei jeder Bewegung die vorherige Position des Fingers des Benutzers prüfe und dann herausfinde, in welche Richtung ich den Spieler bewegen muss.

Das funktioniert nicht sehr gut. Ich nehme an, dass es hier einige IPhone-/Android-Entwickler gibt, die herausgefunden haben, wie man eine gute Steuerung über einen Touchscreen hinbekommt, und die einen Rat geben können.

0 Stimmen

Können Sie die Begriffe "funktioniert nicht so gut" und "zu verzögert oder zu empfindlich" definieren? Eine Beschreibung, wie sich das verhält, wäre nützlich

0 Stimmen

Zwei empfindlich bedeutet, dass ich meinen Finger ein Zehntel eines Zolls bewege und der Spieler ist über den Bildschirm zu verzögert bedeutet, dass ich meinen Finger über den gesamten Bildschirm bewegen muss, um den Spieler einen Zoll zu bewegen :)

2voto

Thomas Punkte 160390

Sie könnten etwas Ähnliches wie "Rechtecke ziehen" unter Windows versuchen. Wenn Sie die Maustaste auf einem Objekt gedrückt halten, beginnt der Ziehvorgang erst, wenn sich die Maus über einen kleinen Bereich um die Position des gedrückten Mauszeigers hinaus bewegt. Der Grund dafür ist, dass es sehr schwierig ist, den Mauszeiger beim Klicken auf demselben Pixel zu halten.

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

Dabei geht es jedoch nicht um das Umdrehen im selben Zug. Sie könnten das Problem lösen, indem Sie nur nach links drehen, wenn die aktuelle Position mindestens DEAD_ZONE Pixel nach dem Abbiegen nach rechts links von der letzten Position und umgekehrt.

2voto

Andrew Grant Punkte 57342

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

Ich würde vorschlagen, dass Sie die Berührung des Spielers als Ausdruck der gewünschten Bewegung auf einem analogen Bereich von -x/+x y -y/+y und führen dann die eigentliche Bewegung zeitabhängig an anderer Stelle durch.

z.B.

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

Wenn also die maximale Geschwindigkeit deines Objekts 10ms-1 beträgt und der Finger des Spielers auf dem Steuerkreuz auf 0,5 steht, würde sich das Objekt jede Sekunde 5 Meter bewegen. Wenn dein Spiel mit 10fps läuft, dann würde sich das Objekt in jedem Frame 0,5 Meter bewegen.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X