2009-03-15 5 views
8

Je travaille sur mon premier jeu vidéo pour la plate-forme Android en tant que projet de nuits et de week-ends.Utilisation des écrans tactiles pour le contrôle du jeu

Ça se passe bien, mais je suis très mécontent de la sensibilité au contrôle.

Dans ce jeu, vous déplacez un objet à gauche et à droite sur l'écran. En bas de l'écran se trouve un "pavé tactile" de toutes sortes, sur lequel repose votre doigt.

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

J'utilise actuellement une variable d'état de tenir « MOVING_LEFT, MOVING_RIGHT, NOT_MOVING » et suis mise à jour du lieu de l'objet de joueur chaque image en fonction de cette variable.

Cependant, mon code qui lit l'entrée de l'écran tactile et définit cette variable d'état est trop sensative, ou trop laggy, selon la façon dont je Tweak:

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

L'idée est que quand il y a un mouvement , Je vérifie l'emplacement précédent du doigt des utilisateurs, puis détermine dans quelle direction déplacer le lecteur. Cela ne marche pas très bien, je pense qu'il y a des développeurs IPhone/Android qui ont compris comment faire de bons contrôles via un écran tactile et qui peuvent donner quelques conseils.

+0

Pouvez-vous définir "ne fonctionne pas trop bien" et "trop ​​laggy ou trop sensible". Une description de comment cela se comporte serait utile –

+0

Deux moyens sensibles que je déplace mon doigt un 10ème de pouce et le joueur est à travers l'écran .. trop laggy signifie que je dois déplacer mon doigt sur l'ensemble de l'écran pour déplacer le joueur un pouce. :) – FlySwat

Répondre

2

Vous pouvez essayer quelque chose de similaire à "glisser des rectangles" sur Windows. Lorsque vous maintenez le bouton de la souris sur quelque chose, vous ne commencez pas une opération de déplacement jusqu'à ce que la souris se déplace en dehors d'une petite région autour de l'emplacement de la souris. Raison d'être qu'il est très difficile de garder le curseur sur le même pixel en cliquant.

Donc, une première tentative pourrait être (int)e.getX() >= this.mTouchX + DEAD_ZONE et similaire pour l'autre cas, où DEAD_ZONE est un petit nombre entier.

Cependant, cela ne concerne pas le retournement dans le même mouvement. Vous pouvez traiter cela en tournant seulement à gauche lorsque la position actuelle est au moins DEAD_ZONE pixels à gauche de la dernière position après avoir tourné à droite, et vice versa.

2

Un problème évident est que vous ne tenez compte nulle part du temps écoulé depuis le dernier contact.

Je vous suggère de traiter les joueurs comme une expression du mouvement souhaité sur une plage analogique de -x/+x et -y/+y, puis effectuez le mouvement réel ailleurs en fonction du temps.

E.g.

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

Donc, si le max-vitesse de votre objet est 10ms-1 et le doigt du joueur est à 0,5 sur le pavé de commande alors l'objet déménagerait 5 mètres par seconde. Si votre jeu tourne à 10 images par seconde, l'objet se déplacera sur 0,5 mètre à chaque image.

Ces chiffres sont fictifs, mais nous espérons démontrer la nécessité de séparer le contrôle du mouvement et ensuite factoriser dans le temps.

Questions connexes