2009-03-15 9 views
8

Estoy trabajando en mi primer videojuego para la plataforma Android como un proyecto de noches y fines de semana.Uso de TouchScreens para control de juegos

Está viniendo muy bien, pero estoy muy contento con la sensibilidad del control.

En este juego, mueves un objeto hacia la izquierda y hacia la derecha en la pantalla. En la parte inferior de la pantalla hay una especie de "touchpad", que es donde debe descansar su dedo.

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

actualmente estoy usando una variable de estado para mantener "MOVING_LEFT, MOVING_RIGHT, NOT_MOVING" y estoy actualizando la ubicación del objeto de reproductor de cada trama en base a esa variable.

Sin embargo, mi código que lee la entrada de pantalla táctil y establece esta variable de estado es demasiado sensative, o demasiado lag, dependiendo de cómo me retocarlo:

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

La idea es que cuando hay algún movimiento , Compruebo la ubicación previa del dedo del usuario y luego descubro en qué dirección mover el reproductor.

Esto no funciona muy bien, me imagino que hay algunos desarrolladores de iPhone/Android aquí que han descubierto cómo hacer buenos controles a través de una pantalla táctil y pueden dar algunos consejos.

+0

Puede definir "no funciona demasiado bien" y "demasiado lento o demasiado sensible". Una descripción de cómo se comporta esto sería útil –

+0

Dos medios sensibles que muevo el dedo una décima de pulgada y el jugador está sobre la pantalla ... demasiado lento significa que tengo que mover el dedo por toda la pantalla para mover el reproductor una pulgada. :) – FlySwat

Respuesta

2

Puede intentar algo similar a "arrastrar rectángulos" en Windows. Cuando mantiene presionado el botón del mouse sobre algo, no inicia una operación de arrastre hasta que el mouse se mueve fuera de una región pequeña alrededor de la ubicación del mouse. La razón es que es muy difícil mantener el cursor en el mismo píxel mientras se hace clic.

Así que un primer intento podría ser (int)e.getX() >= this.mTouchX + DEAD_ZONE y similar para el otro caso, donde DEAD_ZONE es un número entero pequeño.

Esto no se trata de dar la vuelta en el mismo trazo, sin embargo. Podrías lidiar con eso girando solo a la izquierda cuando la posición actual es al menos DEAD_ZONE píxeles a la izquierda de la última posición después de girar a la derecha, y viceversa.

2

Un problema obvio es que en ninguna parte se tiene en cuenta el tiempo transcurrido desde el último toque.

que sugeriría usted trata a los jugadores tocan como una expresión del movimiento deseado en una gama analógica de -x/+x y -y/+y, a continuación, realizar el movimiento real basado en otro lugar en el tiempo.

E.g.

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

Así que si el máximo de velocidad de su objeto es de 10 ms-1 y el dedo jugadores está en 0.5 en el panel de control entonces el objeto se mueve a 5 metros por segundo. Si tu juego se ejecuta a 10 fps, entonces cada fotograma del objeto se moverá 0.5 metros.

Estas figuras son ficticias, pero es de esperar que demuestren la necesidad de separar el control del movimiento y luego factorizar el tiempo.

Cuestiones relacionadas