Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ayuda Movimiento

Iniciado por Ezequielk, 17 de Diciembre de 2010, 07:30:56 PM

« anterior - próximo »

Ezequielk

Buenos días a todos.
Quería saber como hacer un movimiento de un personaje, por ejemplo si yo tengo 5 imagenes, correspondientes al movimiento del personaje (IMG01, IMG02, IMG03, IMG04 Y IMG05), como haría para mostrarlas una seguida de la otra? si lo hago con un while por ejemplo, lo hace tan rapido que termino viendo la ultima imagen solamente y no las primeras, como debería hacer para que las valla mostrando con un determinado tiempo de espera?
Desde ya muchas gracias

PD: empecé hace poco con esto de la programacion en sí, hace 3 meses con vb6 y hace 2 dias con esta libreria XD asi que van a tener que ayudarme con unas cuantas dudas :P

Hechelion

#1
Vamos por parte, lo primero que tienes que tener claro para crear una animación  es el ciclo de un juego. Normalmente y simplificado, un juego hace lo siguiente

Refreso de input -> Refresco de lógica -> Dibujo en pantalla


Esto significa que cuando haces una operación lógica, esta no se va a ver reflejada en pantalla  hasta que pases el foco a las rutinas de dibujo y refresques la salida. Ese ciclo, si tu no lo limitas, se va a ejecutar tantas veces como tu hardware lo permita , lo ideal es  que por lo menos tu ciclo lógico se encuentre limitado en el número de veces que se ejecuta por segundo.

Hay dos técnicas para eso, una es disparar los eventos lógicos por tiempo, por ejemplo un contador que cada 1/2 segundo te cambie la imagen de la animación, el problema con esa técnica es que los timer en VB no son deterministicos y si agregas demasiados tiempos es muy fácil que te termines liando si no aplicas algunos conceptos de programación con multi-hilos. Así que mejor usar la segunda técnica que consiste en contar y sincronizar la parte lógica con los ciclos del juego.

La verdad es que explicar todo, incluyendo el concepto es bastante  (ya llevo varios minutos escribiendo y aún no llego a ningún ejemplo concreto que te sirva), así que mejor te doy un rápido resumen, te aconsejo que trabajes los 3 ciclos de forma sincrona y que limites el número de ciclos por segundo usando la librería:

Código (vb) [Seleccionar]

Do While MainLoop
   'Aquí metes la función que detecte y refresque el input
   'Acá metes las funciones lógicas como movimiento
   'Acá las funciones encargadas de dibujar
   Call m_gfx.Frame(0, 60, True) 'limitar el programa a 60 FPS
Loop


Ese código limita el ciclo de tu juego a 60 veces por segundos.

Ahora que sabemos cuantas veces se va a dibujar la imagen en un segundo, debemos controlar cuando vamos a necesitar los cambios, por ejemplo si queremos cambiar la imagen cada 1/2 segundo, entonces debemos hacer el cambio cada 30 ciclos, para eso necesitamos contar los ciclos transcurridos

Código (vb) [Seleccionar]

Do While MainLoop
   'Aquí metes la función que detecte y refresque el input
   i = (i +1) mod 120    'esta función hace que i cuente de 0 a 119
   select case int(i / 30)
        case 0: 'coloca el dibujo de la primera imagen
        case 1: 'coloca el dibujo de la segunda imagen
        case 2: 'coloca el dibujo de la tercera imagen
        case 3: 'coloca el dibujo de la cuarta imagen
   end select
   'Acá las funciones encargadas de dibujar
   Call m_gfx.Frame(0, [b]60[/b], True)[b] 'limitar el programa a 60 FPS[/b]
Loop


Con eso ya tienes lo básico para mostrar 4 imágenes  y que cada una dure 30 ciclos o sea 1/2 segundos, pero replicar eso para hacer un juego sería tan complicado como armar un edificio con palios de fosforo. así que mejor mira este post, acá hay una clase que permite administrar animaciones:
http://www.stratos-ad.com/forums/index.php?topic=11944.0

El editor de animaciones es ahí no más, originalmente lo cree para ayudarme a crear los archivos para las animaciones en vez de hacerlas a mano, así que nunca partí haciendo el diseño y termine construyendo la herramienta  a la rápida, aún así es bastante útil e igual puedes crear los archivos de animación (son archivos de texto plano) con cualquier editor de texto como el notepad.

http://www.youtube.com/watch?v=6MQhajvfLM4
http://www.youtube.com/watch?v=S1BhRXMAzl8
http://www.youtube.com/watch?v=IAimoa2KnqU

Todas las animaciones que salen en esos videos están creadas con esa clase, así que te debería ahorra muchos trabajo a la hora de implementar tu juego.


Ezequielk

Muchas gracias por tu respuesta!
Otra pregunta :P
¿Entonces supuestamente toda la base del juego se resumiría a un do while-loop?

Hechelion

Si, la base del juego se resume a un while-loop, en la medida que ganes experiencia y conozcas otras técnicas puedes ir agregando cosas o cambiando cosas, pero para partir lo mejor es tener todo en el ciclo (Usa funciones  y sobre todo clases para no tener un desorden horrible en la medida que tu juego crezca )

techmachine

Tambien se puede usar un timer para hacer la animacion, es muy facil de usar  ;)

Ezequielk

Tengo otra duda, si por ejemplo yo tengo una animación de un "Hechizo", que quiero que se vea solamente cuando tiro ese "Hechizo", como tendría que hacer? No está la propiedad Visible, tendría que crear una animacion "Vacio" y que siempre se dibuje esa animacion hasta que tiore el hechizo y mostraria la animación "Hechizo"?
Saludos

PD: Todo esto hablando de la clase que creaste Hechelion :P

techmachine

#6
Ahi tendrias que variar y usar un DO UNTIL

cuadro=0
if lanzahechizo=true then
 DO UNTIL cuadro = 6
   if cuadro = 0 then mostrar hechizo01.jpg
   if cuadro = 1 then mostrar hechizo02.jpg
   if cuadro = 2 then mostrar hechizo03.jpg
   if cuadro = 3 then mostrar hechizo04.jpg
   if cuadro = 4 then mostrar hechizo05.jpg
   if cuadro = 5 then mostrar hechizo06.jpg
   if cuadro = 6 then mostrar hechizo07.jpg
   cuadro=cuadro+1
 LOOP
 lanzahechizo=false
end if


el ciclo DO UNTIL insertalo en un timer o sino se movera tan rapido que solo veras la ultima imagen. ademas con el timer puedes controlar la velocidad de la animacion ;)

Hechelion

Cita de: Ezequielk en 19 de Diciembre de 2010, 04:17:47 AM
Tengo otra duda, si por ejemplo yo tengo una animación de un "Hechizo", que quiero que se vea solamente cuando tiro ese "Hechizo", como tendría que hacer? No está la propiedad Visible, tendría que crear una animacion "Vacio" y que siempre se dibuje esa animacion hasta que tiore el hechizo y mostraria la animación "Hechizo"?
Saludos

PD: Todo esto hablando de la clase que creaste Hechelion :P

El control del dibujo se hace sobre el método "Draw", así lo pensé, ya que la idea es que la parte gráfica sólo se encargue de dibujar y sea una capa superior la encargada de determinar si se debe dibujar o no.

Por ejemplo
Código (vb) [Seleccionar]

If MostrarHechizo then ClaseAnimacionHechizo.Draw


El control de cuando se debe mostrar la animación lo haces con la variable "MostrarHechizo".

PD: TechMachine, la pregunta de Ecequiel K, va por una clase para animaciones para la Dxlib_32, no por el lado de crear la animación desde 0.

techmachine

jaja, soy muy "bruto" parece xD , en todo caso, ahora si estuve examinando las clases que creaste, creo que las ocupare yo tambien y me ahorrare un buen trabajo :)

Ezequielk

Otra dudita :P
Estoy empezando con betas de un jueguito que estoy haciendo, y se las quiero pasar a un amigo, le paso el exe pero le tira error, será porque tiene que instalar la dxlib32??? si es asi como hago? porque me parece muy poco practico pasarle el instalador de la libreria, porque sino a todos les tendria q pasar eso, no hay alguna manera de que se instale abriendo el exe? o con algun instalador?

[EX3]

#10
Cita de: Ezequielk en 20 de Diciembre de 2010, 10:41:41 PM
porque me parece muy poco practico pasarle el instalador de la libreria, porque sino a todos les tendria q pasar eso, no hay alguna manera de que se instale abriendo el exe? o con algun instalador?
Ezequiel, que se supone que haces con los juegos y la mayoria de programas que utilizas en casa? Los instalas, verdad? :)

Lo primero es que para que un programa de Visual Basic 6.0 funcione en otra maquina que no sea la tuya deberas instalar varias librerias, las basicas son dos que son la base de Visual Basic 6.0, las demás dependeran de los controles externos a Visual Basic 6.0 que agregues, como dx_lib32 por ejemplo. En resumen, tienes que hacerte un instalador para tu juego donde agregues el ejecutable y todo los recursos que este utilice (graficos, audio, etc...). Luego tendrás que instalar a parte el paquete redistribuible que diseñe para tal tarea y que encontraras en la seccion de descargas justo debajo del paquete de desarrollo que bajaste la primera vez. Este paquete ya incluye tanto las librerías base de Visual Basic 6.0 como dx_lib32 y sus librerías de dependencia, por lo que este paquete instalaría todas las librerías necesarias para ejecutar tu juego en cualquier maquina que ejecute Windows. Piensa que este instalador seria algo tan común como cuando tienes que bajarte la ultima versión de DirectX para ejecutar tus juegos ;)

Puedes usar generadores de instalaciones como Inno Setup utilizando su editor visual, para generar tus instalaciones.

Yo te diría, que ahora que estas haciendo pruebas, hagas un simple ZIP donde metas tu juego y el paquete redistribuible para pasárselo a tus amigos, con que instalen una vez dicho paquete les servirá para las próximas pruebas que les pases.

Salu2...

P.D.: Habría otra forma de hacerlo, que seria creando un único instalador que instalara tanto el juego como el paquete redistribuible de dx_lib32 de manera automática pero esto es mas complejo de hacer y según el instalador que fueras a usar deberías estudiar si permite tal acción y como agregarla. Yo nunca lo he hecho.
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

techmachine

Tambien puedes probar a usar molebox, con eso empaquetas todo el archivo en un unico ejecutable y no habra necesidad de instalar nada. eso si, debes incluir en el paquete todo lo que vaya a necesitar tu juego, llamese archivos de imagenes, de audio y librerias (dx_lib32 y la libreria de dx8 son indispensables, y funcionan incluso en windows vista y windows 7), en cuanto al proyecto mismo, basta con que incluyas el ejecutable que te crea el mismo VB, ahi puedes obviar los formularios y modulos ;)

[EX3]

Hace tiempo que deje de recomendar Molebox dado que en las ultimas versiones los ejecutables empaquetados los antivirus los detecta como malware, lo cual no da mucha confianza la gente que vaya a ejecutar tus programas, amen aparte de que Molebox no es gratis, son 200€ que recuerde su licencia básica.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

techmachine

Cita de: [EX3] en 21 de Diciembre de 2010, 03:24:48 AM
Hace tiempo que deje de recomendar Molebox dado que en las ultimas versiones los ejecutables empaquetados los antivirus los detecta como malware, lo cual no da mucha confianza la gente que vaya a ejecutar tus programas, amen aparte de que Molebox no es gratis, son 200€ que recuerde su licencia básica.

Salu2...

seré un iluminado entonces, que yo tengo una version antigua y full y ningun antivirus le ha detectado nada como malware?  a lo mas, si lo envio via msn comprimido en un rar me manda el tipico mensaje de advertencia que podria ser un archivo peligroso, pero eso mas que nada porque se crea un archivo unico ejecutable. en fin, a mi al menos me es mas practico :)

[EX3]

Virus Scan 8 y siguientes versiones, Kapersky y Avast antivirus son buenos ejemplos de antivirus que me tumban mis antiguos ejecutables empaquetados con Molebox. Yo hacer lo que queráis pero sigo diciendo que distribuir un programa que hace saltar la alarma de los antivirus solo crea desconfianza. No hace mucho por aqui en foro le ocurrio esto a otra persona que usaba Molebox para empaquetar sus proyectos.

Cita de: techmachine en 21 de Diciembre de 2010, 03:32:29 AM
en fin, a mi al menos me es mas practico :)
Si ya se que es practico distribuir tu juego en un solo ejecutable sin instalación ni nada pero desde luego Visual Basic 6.0 no es la herramienta adecuada para este tipo de desarrollos dada su fuerte dependencia de librerías externas. Yo estuve años atrás probando otras herramientas similares como Fusion y primeras versiones de Molebox, pero si unas daban problemas con que el ejecutable generado no funcionaba otras daban el problema de los antivirus y los falsos positivos.

Si vais a desarrollar con Visual Basic 6.0 tenéis que tener en cuenta que lo mas fiable es usar una instalación si queréis distribuir fiablemente vuestros proyectos. Si queréis algo mas portable podéis desarrollar con Visual Basic .NET, ahí podéis distribuir el ejecutable sin instalación alguna (siempre y cuando la versión de .NET Framework que uséis este instalada en la maquina del usuario), el problema es que dx_lib32 seguiríais debiendo instalarlo mediante el paquete redistribuible.

Yo lo dicho, si queréis usar Molebox usarlo pero no os extrañéis si luego os llegan quejas de gente por el falso positivo del antivirus.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.