[SDL]mejor forma de mover objetos en milisegundos?

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

[SDL]mejor forma de mover objetos en milisegundos?

Notapor baigos » Dom Oct 03, 2010 6:08 am

Hola, me presento, soy baigos de Corrientes Capital Nacional de los bulones.
Ando programando algunas cosas en C + SDL, y resulta que lo que quiero hacer es hacer una funcion mas o menos de este tipo:
void moverobjeto(SDL_Surface *img, Uint16 tiempo, int cantidad_a_mover_en_x)

donde yo le doy un cierto intervalo de milisegundos, y una cantidad en pixeles a desplazar en ese tiempo. La velocidad sería calculada segun los parametros. El tema es como hacerlo, se me ocurrieron 2 ideas:

-Tengo el framerate fijado en 60 cuadros, con lo cual cada 17 ms (aproximadamente) dibujo un cuadro. Entonces hago (17 ms x cantidad_a_mover)/tiempo en ms y obtengo la cantidad de pixeles que debo mover cada 17 ms (o el intervalo de dibujado que le asigne en ms).

-Divido el tiempo en ms por la cantidad de pixeles a mover, y obtengo un intervalo de dibujado en milisegundos.

La primer solucion es la que tengo mas accesible, el tema es que SDL_Rect al tener x e y en Sint16 no es preciso, y no llega a la cantidad de pixeles fijada (o se pasa).
En la segunda se me arma un quilombo con los timers, y tampoco es precisa. Ademas como fijo un framerate, tengo un problema alli tambien.

He visto que stepmania implementa algunas funciones similares, pero el codigo fuente del stepmania es mas intrincado que la vida de ricardo fort.

Si alguien aporta alguna idea bienvenida será, y asi podremos mover una superficie conteniendo a zulma lobato en milisegundos bla bla bla...el sueño de todo ser humano...bla bla bla
El sitio de videojuegos del nordeste argentino:
www.arcadenea.com.ar
baigos
 
Mensajes: 27
Registrado: Dom Oct 03, 2010 5:51 am

Re: [SDL]mejor forma de mover objetos en milisegundos?

Notapor carlostex » Dom Oct 03, 2010 7:31 am

Creo que cualquier programador se a preguntado eso y es un tema básico de animaciones.
El caso es que ni una de las dos formas te sirve.
para empezar dividiría el problema en dos partes, primero hacer que se mueva con una velocidad fijada y la otra parte seria checar cuanta distancia ya recorrió si es mayor a la que le pasaste lo detienes.
Yo tengo hecho toda una clase para animaciones pero el núcleo son las siguientes funciones;
Código: Seleccionar todo

float d_vt(float velocidad, Uint32 tiempo)
{
    return velocidad*tiempo/1000.0;

}

//Calcula la posicion de un punto al haber transcurrido time_trans (ms), con respecto a su posicion actual
//es decir la posicion no depende de los FPS.
float next_point(punto &posicion,punto posicion_inicio, Vector velocidad, int time_trans)
{
    punto aux=posicion;
    posicion.x=posicion_inicio.x+d_vt(velocidad.magnitud, time_trans)*cos(to_rad(velocidad.angulo));
    posicion.y=posicion_inicio.y-d_vt(velocidad.magnitud, time_trans)*sin(to_rad(velocidad.angulo));
    return dist_2puntos(aux,posicion);
}


el funcionamiento es que tu le envias la posicion actual por ejemplo(1,1), la velocidad en forma vectorial, y el tiempo que transcurrio desde que llamaste a la función, asi si la velocidad es 1 con 0 grados que es 1 en x y 0 en y en un segundo va avanzar un píxel. lo que regresa es la magnitud del vector de posición, pero como conoces el ángulo en el que se mueve solo haces las proyecciones en los ejes x e y y es lo que le sumas a la posición actual, y así vas llamando en cada ciclo a esta función.
Nunca he visto como hacen los demás para hacer algo así, pero esta función esta fundamentada en el calculo integral.
nada mas que esto calcula los pequeños pedazos de la curva, si sumas todos te va a dar la longitud de la curva.
y si vas pegando cada pedazo con el ángulo respectivo se crea la forma de la curva.
las diferencias de tiempo son las dt. Esto permite ir cambiando el ángulo para cada llamada a la función
el único detalle es que si llamas a la función en tiempos muy cortos mientras cambias el ángulo casi no va a avanzar debido a que la pantalla tiene posiciones discretas.

No supongas que en cualquier maquina el framerate va a ser el mismo.

Yo uso un framerate semi estable, fijo un framerate por ejemplo 30, y se va a tratar de mantener los 30 fps, pero puede variar, podría disminuir a 28 si hay que hacer algún calculo pesado, pero eso no afectara las posiciones de la animación, por que dependen del tiempo, no del framerate.incluso por alguna razón aveces aumenta a 34, por eso digo que es semi.
El conocimiento de unos es conocimiento de todos.
Avatar de Usuario
carlostex
 
Mensajes: 249
Registrado: Mar Jul 14, 2009 4:13 am
Ubicación: mexico

Re: [SDL]mejor forma de mover objetos en milisegundos?

Notapor baigos » Dom Oct 03, 2010 2:01 pm

muchas gracias che, voy a aplicar el método a ver que sale
El sitio de videojuegos del nordeste argentino:
www.arcadenea.com.ar
baigos
 
Mensajes: 27
Registrado: Dom Oct 03, 2010 5:51 am


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

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

cron