Movimiento
De CursosGpl
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).
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);
}

