Movimiento

De CursosGpl

movimiento
movimiento

cuarta parte del tutorial

En este capítulo asignamos algunas teclas al movimiento de la cámara. Para ello introduciremos una función para comprobar el teclado y actualizar la posición de la cámara antes de dibujar cada cuadro (en la función de respuesta al evento cscmdProcess).

código c++

Tabla de contenidos

[editar] Conceptos

[editar] Comprobación contínua del teclado

Nos interesa comprobar todos los cuadros si las teclas requeridas están pulsadas para actualizar el movimiento de la cámara adecuadamente. Para esto utilizamos el módulo de acceso al teclado iKeyboardDriver.

En concreto comprobaremos cada tecla usando

kbd->GetKeyState (CSKEY_PGDN)

con los códigos de las distintas teclas.

[editar] Usando el reloj virtual

Debemos asegurarnos de que la animación se verá de la misma manera independientemente de la velocidad de este. Normalmente un ordenador más rápido renderizará más cuadros, pero nos interesa que en cualquier caso la velocidad percibida de movimiento sea la misma (no la suavidad de dicho movimiento).

En general obtenemos el tiempo transcurrido con el iVirtualClock

csTicks tiempo_transcurrido = vc->GetElapsedTicks ();

[editar] Programación

[editar] Función de respuesta al teclado

void DelBase::RespondeTeclado(csTicks tiempo_transcurrido)
{
 float velocidad = (tiempo_transcurrido / 1000.0) * (0.03 * 20);       
 iCamera* c = view->GetCamera();
 if (kbd->GetKeyState (CSKEY_SHIFT))
 {
         if (kbd->GetKeyState (CSKEY_RIGHT))
               c->Move (CS_VEC_RIGHT * 4 * velocidad);
         if (kbd->GetKeyState (CSKEY_LEFT))
               c->Move (CS_VEC_LEFT * 4 * velocidad);
         if (kbd->GetKeyState (CSKEY_UP))
               c->Move (CS_VEC_UP * 4 * velocidad);
         if (kbd->GetKeyState (CSKEY_DOWN))
               c->Move (CS_VEC_DOWN * 4 * velocidad);
 }
 else
 {
         if (kbd->GetKeyState (CSKEY_RIGHT))
               rotY += velocidad;
         if (kbd->GetKeyState (CSKEY_LEFT))
               rotY -= velocidad;
         if (kbd->GetKeyState (CSKEY_PGUP))
               rotX += velocidad;
         if (kbd->GetKeyState (CSKEY_PGDN))
               rotX -= velocidad;
         if (kbd->GetKeyState (CSKEY_UP))
               c->Move (CS_VEC_FORWARD * 4 * velocidad);
         if (kbd->GetKeyState (CSKEY_DOWN))
               c->Move (CS_VEC_BACKWARD * 4 * velocidad);
 }
 csMatrix3 rot = csXRotMatrix3 (rotX) * csYRotMatrix3 (rotY);
 csOrthoTransform ot (rot, c->GetTransform().GetOrigin ());
 c->SetTransform (ot);
}
Herramientas personales