int fps_sincronizar (void) del ejempo de desplazamiento suav

Losersjuegos cuenta con una secciones de ejemplos en su web. Utilice esta sección para consultar o proponer ideas acerca de ellos.

int fps_sincronizar (void) del ejempo de desplazamiento suav

Notapor baco » Mar Sep 23, 2008 4:30 pm

Hola:

Como veréis soy nuevo por aquí pero espero estar para mucho tiempo xD

He estado viendo algunos ejemplos y me ha parecido que lo de sincronizar de aquí es para que en todos los ordenadores el 'tanque' se desplace del punta A al B en el mismo tiempo (si refresca solo dos veces parecerá que se teletransporta...) pero no entiendo como se logra hacerlo.

¿alguien con paciencia me lo explica?

Código: Seleccionar todo
int fps_sincronizar (void)
{
   static int t;
   static int tmp;
   static int tl = 0;

   t = SDL_GetTicks ();

   if (t - tl >= FRECUENCIA)
   {
      tmp = (t - tl) / FRECUENCIA;
      tl += tmp * FRECUENCIA;
      return tmp;
   }
   else
   {
      SDL_Delay (FRECUENCIA - (t - tl));
      tl += FRECUENCIA;
      return 1;
   }
}


y que luego es usado en:
Código: Seleccionar todo
repeticiones = fps_sincronizar ();

      for (i = 0; i < repeticiones; i ++)
      {
         mover_tanque (& tanque);
         mover_camara (& camara, & tanque);
      }


PD: Para el que ayude que tenga en cuenta que solo se algo de C
baco
 
Mensajes: 7
Registrado: Lun Sep 22, 2008 4:48 pm

Notapor hugoruscitti » Mié Sep 24, 2008 7:05 pm

Saludos, el código de la función "fps_sincronizar" se utiliza para regular la
velocidad del juego. Resulta que los equipos donde puede correr este programa
son muy diversos, algunos equipos son tan rápidos que podrían actualizar la
posición del tanque 300 veces por segundo...

Pero, lejos de ser una ventaja esto es un problema, porque desearíamos que el
juego funcione a la misma velocidad en todos los equipos, ni muy lento ni
extremadaménte rápido.

La función "fps_sincronizar" hace uso de ciertas funciones de SDL para
controlar la velocidad del programa en base al tiempo transcurrido. Esta
función llamada SDL_GetTicks consulta constantemente cuantos segundos
milisegundos han transcurrido desde la inicialización de la biblioteca. En
base a esta consulta de tiempo intenta determinar uno de estos casos:

+ si el equipo es muy rápido llama a SDL_Delay para detener unos
instantes la ejecución del programa (y que no corra tan rápido).
+ si el equipo es muy lento intenta actualizar la posición del tanque
mas veces de las que imprime, esto es lo que se conoce como saltos de
cuadros, y puedes ver como se utiliza en la segunda función. Si el
equipo es muy lento la función "fps_sincronizar" devuelve un número
mayor a 1.


En la web de losersjuegos hay un artículo que muestra esta técnica:

http://www.losersjuegos.com.ar/referenc ... /bucle.php
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor baco » Vie Sep 26, 2008 4:31 pm

Ahora voy a ver el ejemplo

Gracias
baco
 
Mensajes: 7
Registrado: Lun Sep 22, 2008 4:48 pm


Volver a Ejemplos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados