SoloCodigo
Programación Específica => Programación de Videojuegos => Mensaje iniciado por: ibito en Viernes 31 de Diciembre de 2004, 17:30
-
Como le hago para controlar la animacion de un sprite ? lo que pasa es que los sprites se ven demasiado rapido (la animacion), entonces una vez lo que hice fue hacer una funcion playAnimation(animation, time) y lo que hacia era dividir los fps que tenia entre time ( o algo asi la verdad ya no receuerdo), y se veia con ese tiempo pero me dijeron queno era buena idea hacerlo asi :P
Que manera utilizan ustedes?
de antemano gracias por la respuesta
-
Que manera utilizan ustedes?
La velocidad de animacíon se controla en toda la escena y no por separado.
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
procedimiento CicloJuego;
variables
TiepoComienzo: Longint; //indicará cuando comenzo la escena
comenzar
mientras GameRunning hacer
comenzar
{se graba el tiempo de comienzo}
TiempoComienzo = ObtenerTiempoActual;
{Obtener el estado de las entradas}
LeerTeclado;
{realizar los pasos de la inteligencia artificial}
RealizarInteligenciaArtificial;
{Actualizar posicion Sprites}
ActualizarPosicionSprite;
{Testear Collision}
CheckearColision;
{Realizar los sonidos}
TocarSonidos;
{Realizar la musica}
TocarMusica;
{Finalmente Volcar todo a pantall}
VolcarPantalla;
{Determina si el ciclo del juego debe continuar}
GameRunning = IsGameOver;
{Esta es la parte que verifica cuanto tiempo paso despues
del comienzo de la escena, si es menor al debido, la animacion será
demasiado rapida por lo que hay que detener todo hasta que el tiempo sea
el adecuado y concida con los FPS buscados}
si ObtenerTiempoActual-TiempoComienzo < TiempoDeseado(FPS) entonces
RetenerJuegoHasta(ObtenerTiempoActual-TiempoComienzo);
fin mientras;
fin procedimiento
{nuestro sprite es así:}
Sprite : objeto
Imagen: Array[0..5] of Imagen; //son las imagenes del sprite
AnimCount: integer; // el frame de la animacion actual
Frames: integer = 5;
metodo Dibujar(Donde: PantallaVirtual); //algun procedimiento que dibuja es sprite
fin conjunto
{el procedimieto de UpdateSprite seria asi, tomando en cuent}
procedimiento ActualizarPosicionSprite;
comenzar
Sprite.Imagen[AnimCount].Dibujar(Buffer);
Animcount = AnimCount + 1;
si AnimCount = Frames entonces AnimCount = 0;
fin procedimiento
<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
Como observas en el pseudo, Ni importa los FPS del sprite, sino los de la escena, me refiero a que la animacion debe ser controlada respecto a todo lo visible en la pantallay no por cada cosa que se ve.
Espero no ser confuso :lightsabre:
me dijeron queno era buena idea hacerlo asi
De tu forma, Creas multiples animaciones en la pantalla y controlas su velocidad por separado lo que te complica las cosas.
Segun el pseudo anterior, Debes controlar la pantalla como una única animacion.
-
muchas gracias por la respuesta, creo haber entendido :D
-
Personalmente, prefiero establecer una velocidad en cuadros por segundo independiente para cada uno de los sprites que tenga, para así tener mayor control. Si entras aqui:
io3d/src (http://desarrollo.mondedeu.com/cgi-bin/viewcvs.cgi/io3d/src/)
puedes ver la implementación que tengo de los sprites animados. En concreto, fijate en los archivos
io3d/src/textures.h (http://desarrollo.mondedeu.com/cgi-bin/viewcvs.cgi/io3d/src/textures.h?rev=1.2&view=markup)
io3d/src/textures.cpp (http://desarrollo.mondedeu.com/cgi-bin/viewcvs.cgi/io3d/src/textures.cpp?rev=1.2&view=markup)
Puedes ver el método CTexture::getImage(), que retorna el cuadro que corresponda según su velocidad. Este uso te permite simplificar mucho el código del programa que lo maneja.
Un saludo.
Ruben3d