SDL - Control de tiempo

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

SDL - Control de tiempo

Notapor Requeteguay » Mié Ago 16, 2006 7:18 pm

Hola Foro!

Estaba intentando dar un control de tiempo entre pulsaciones dentro del código del juego de Volleyball.

¿Cómo podría plantear un control de los intervalos de tiempo entre teclas? Me explico: para golpear la pelota hay que pulsar la tecla UP, pero me gustaría que se pudiese pulsar después de pasados (cómo poco) 0,5 seg. contando desde la última pulsación de la tecla UP (sólo para esta acción, el control de tiempo no se daría con los otros botones).

Sé que en el contexto del juego de Volleyball suena raro pero estoy adaptando este código para un juego de beat 'm up, de ahí esas ideas tan extrañas, jeje.

Siento hacer tantas preguntas ^^. Muchas gracias.
Avatar de Usuario
Requeteguay
 
Mensajes: 9
Registrado: Mié Ago 09, 2006 4:37 pm

Re: SDL - Control de tiempo

Notapor hugoruscitti » Vie Ago 18, 2006 12:01 am

Requeteguay escribió:Estaba intentando dar un control de tiempo entre pulsaciones dentro del código del juego de Volleyball.

¿Cómo podría plantear un control de los intervalos de tiempo entre teclas? Me explico: para golpear la pelota hay que pulsar la tecla UP, pero me gustaría que se pudiese pulsar después de pasados (cómo poco) 0,5 seg. contando desde la última pulsación de la tecla UP (sólo para esta acción, el control de tiempo no se daría con los otros botones).


No estoy muy seguro de poder resolver esa inquietud. Aún así te comentaré algunas ideas:

Se podría añadir una variable como contador en la estructura personaje. Esa variable representaría tu contador de tiempo; será algo limitado pero sencillo y fácil de implementar:

Código: Seleccionar todo
struct Personaje
{
        int tiempo_desde_ultimo_salto;

        [...] // otras variables en la estructura
};


En la sección de código que administra el inicio del "salto" de personaje se tendría que realizar un pequeño cambio para registrar el instante en que se produce el "salto":

Código: Seleccionar todo
if (control_pulso (data->control, LEFT))
{
        data->tiempo_desde_ultimo_salto = 0;

        personaje_cambiar_estado (data, personaje_iniciar_izquierda,
                personaje_izquierda);
}


Para que la variable "tiempo_desde_ultimo_salto" funcione como un contador de tiempo tendríamos que actualizar su valor regularmente.

En el juego Volleyball, el bucle principal del programa llama regularmente a una serie de funciones clasificadas como lógicas, por ejemplo "personaje_actualizar". Realizo este comentario porque, de querer implementar un contador, sería útil actualizarlo dentro de una función "lógica", que será llamada regularmente (creo que 100 veces por segundo, si recuerdo bien):

Así, para actualizar la variable podrías utilizar el siguiente cambio en la función "personaje_actualizar":

Código: Seleccionar todo
void personaje_actualizar (Personaje * data)
{

        /* si esta función se ejecuta 100 veces por segundo, entonces
        cuando la variable 'tiempo_desde_ultimo_salto' vale 100 transcurrió
        1 segundo, cuando vale 200 transcurrieron 2 segundos ... */

        if (data->tiempo_desde_ultimo_salto % 100 == 0)
        {
                printf ("Desde el último salto transcurrieron: ");
                printf ("%d segundos", data->tiempo_desde_ultimo_salto / 100);
                printf ("\n";
        }

        /* se aumenta el contador de tiempo */

        data->tiempo_desde_ultimo_salto ++;
        data->estado (data);
}


Requeteguay escribió:Siento hacer tantas preguntas ^^. Muchas gracias.


Por favor, siempre son bienvenidas.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Requeteguay » Vie Ago 18, 2006 3:20 pm

Gracias por tu ayuda, Hugo.

En cuanto lo pruebe te comento que tal ha ido...

De todas formas me inquieta un poco lo de los 100 ciclos por segundo. ¿Depende de la frecuencia de reloj o es independiente y sirve en todos los equipos con un margen de diferencia mínimo?
Avatar de Usuario
Requeteguay
 
Mensajes: 9
Registrado: Mié Ago 09, 2006 4:37 pm

Notapor hugoruscitti » Lun Ago 21, 2006 6:45 pm

Saludos, perdón por mi demora; estaba realizando los cambios en el sitio web ...

Requeteguay escribió:De todas formas me inquieta un poco lo de los 100 ciclos por segundo. ¿Depende de la frecuencia de reloj o es independiente y sirve en todos los equipos con un margen de diferencia mínimo?


Aquí se plantea una diferencia entre ciclos lógicos y gráficos. Los ciclos lógicos se ejecutarán 100 veces por segundo en todos los equipos (tal vez con márgenes de diferencia pequeños). En cambio los ciclos gráficos, los mas costosos en términos de recursos, se ejecutarán dependiendo del rendimiento del equipo: 100, 90, 80 cuadros ... etc.

El controlador del bucle principal utiliza las funciones SDL_Delay y SDL_GetTicks. Lo cual indicaría que sus retornos y parámetros serán independientes del rendimiento del equipo que las ejecuta.

Lamentablemente, existen algunas pequeñas imprecisiones cercanas a los 10 milisegundos producto de la planificación de los sistemas operativos multitareas como GNU o Windows. Por ejemplos, no siempre podremos asegurar que SDL_Delay (13) esperará exactamente 13 milisegundos, eso depende del Sistema operativo y su estado de procesos.

Esto último lo podemos tratar nuevamente si no se ha entendió. Suena complicado al principio...

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado