Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Animacion del personaje [Una consulta]

Iniciado por Pilton88, 14 de Mayo de 2007, 07:35:28 PM

« anterior - próximo »

Pilton88

Como andan? Aca denuevo yo y mis dudas.
Como sabran, ya estoy implementando un juego (si es que no saben, ya se enteraron :P).
Ya implemente los Tiles, lei el manual de la dx_lib obviamente.
Pero me queda una duda.
Como puedo hacer para, por ejemplo, teniendo el grafico de la animacion en uno solo, al apretar la tecla de la derecha, se vea la animacion llendo hacia la derecha (claro... el tema de apretar la tecla es facil, pero lo que no me entero es lo otro).
Gracias y adios.

Pilton88

Sinceramente, se me ocurre hacer algo con el MAP_Setregion, pero no lo llega a pensar al 100 por cien

RobiHm

Utiliza una máquina de estados, mirate el post que te recomendé leerte xD
Web : Indómita
Blog : MiBlog
Evobas : Evobas
Kobox : Kobox

Pilton88

Bueno, buenos dias ante todo.
Estube ojeando el tema de la maquina de estados, y me resulto bastante bien. Pero hay un problemilla que viene a ser un poco de logica me parece.

Resulta que tengo el siguiente codigo:

Private Sub DetectaTecla()
   'Codigo de Tecla presionada
   Dim Tecla As Long
   'Obtenemos la coordenada actual
   PJ.XAnt = PJ.X
   PJ.YAnt = PJ.Y
   
   If m_input.Key(Key_Right) Then
       PJ.Anim=AnimDerecha
       PJ.X = PJ.X + 2
       Exit Sub
   ElseIf m_input.Key(Key_Left) Then
       PJ.Anim=AnimIzquierda
       PJ.X = PJ.X - 2
       Exit Sub
   ElseIf m_input.Key(Key_Up) Then
       PJ.Anim=AnimArriba
       PJ.Y = PJ.Y - 2
       Exit Sub
   ElseIf m_input.Key(Key_Down) Then
       PJ.Anim = AnimAbajo
       PJ.Y = PJ.Y + 2
       Exit Sub
   End If
End Sub


1- DetectaTecla es un Sub que hace lo que el nombre dice.
2-"PJ" en mi caso, es un Tipo definido, que contiene las coordenadas, la anchura, la altura, y la "Anim" del pj...

Como veran, puse que al mantener presionada tal tecla direccional, ponga una animacion espesifica (el resto del codigo al pedo mostrarlo, porque anda bien).
El problema, es que no me las ingenio para poder comprobar que se haya dejado de Pulsar la tecla de "Izquierda" por ejemplo... cosa de poner la animacion estatica:
PJ.Anim=EstaticaIzquierda

No se si me explico....

EDIT: De paso aprovecho para preguntarles, de que forma puedo hacer para relentizar la animacion... yo pongo un bucle que va de 1 a 3 millones donde dibuja, pero lo que hace es relentizar el movimiento, pero la animacion sigue igual de rapida...

Bueno, desde ya gracias!

RobiHm

If m_input.Key(Key_Right) Then
       PJ.Anim=AnimDerecha
       PJ.X = PJ.X + 2
       Exit Sub
   ElseIf m_input.Key(Key_Left) Then
       PJ.Anim=AnimIzquierda
       PJ.X = PJ.X - 2
       Exit Sub
   ElseIf m_input.Key(Key_Up) Then
       PJ.Anim=AnimArriba
       PJ.Y = PJ.Y - 2
       Exit Sub
   ElseIf m_input.Key(Key_Down) Then
       PJ.Anim = AnimAbajo
       PJ.Y = PJ.Y + 2
       Exit Sub
   else
       'volvemos a la animación en parao
       pj.anim=AniParao
   End If


Yo suelo agregar un timer con intervalo 100 que va sumando +1
on error goto sobrecarga
  tiempo=tiempo+1
  pj.puedo_dibujar=true
  exit sub
sobrecarga:
  error=0
  resume next



Haría lo siguiente:
En donde dibujes los gráficos dibujar
if tiempo MOD 5=0 and pj.puedo_dibujar then
   'pasamos de secuencia
   
   pj.puedo_dibujar=false
endif


Supongo que se podrá hacer de otro modo mas curiosito xD
Web : Indómita
Blog : MiBlog
Evobas : Evobas
Kobox : Kobox

[EX3]

Lo primero es tener bien separado lo grafico de la logica, tal y como hace el matamarcianos por ejemplo. la animacion corresponde a la parte grafica y el movimiento o posicion del objeto a la logica. Despues se debe tener una ligera idea sobre como funciona una animacion. Igual que los fotogramas de una pelicula se actualizan 24 veces por segundo en un juego sucede algo similar. El tema es que se debe hacer pausas para lograr dicha actualizacion, dichas pausas se pueden hacer con los cronometros de tiempo:
Sub DibujarAnimacion()
   Si (Cronometro => Intervalo) Entonces
       ReiniciarCrometro()
       CuadroActual = CuadroActual + 1
       Si (CuadroActual > TotalCuadros) Entonces CuadroActual = 0
   Fin Si
   Dibujar(ListaCuadros(CuadroActual))
Fin Sub

Donde Cronometro podria ser un cronometro creado mediante TIMER_Create() o HITIMER_Create() segun precision de tiempo en el intervalo a usar, Intevalo una constante que define el tiempo que trascurre desde un fotograma a otro, y CuadroActual una variable que indique que fotograma de la animacion se ha dibujar.

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

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

Pilton88

CitarIgual que los fotogramas de una pelicula se actualizan 24 veces por segundo en un juego sucede algo similar.

Joya... dato bastante importante para tener en cuenta. Lo cual, significa que en un segundo, el bucle principal lo recorre 24 veces? (espero haber entendido bien  :oops:
Slds

[EX3]

Generalmente en un juego suele ir mucho mas rapido, sobre todo si no se controla la cantidad y dependiendo de el numero de operaciones a ejecutar en cada ciclo del bucle pudiendo llegar a cantidades desorbitadas como 700~1000 fotogramas por segundo, lo que resulta imposible de controlar a la hora de interactuar con el programa y que no resulta coherente a lo que se deberia ver. Lo normal en un juego suele ser una frecuencia de 30 a 60 fotogramas por segundo para lograr una presentacion fluida y coherente. Esto lo puedes definir en el segundo parametro de la funcion Frame().

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

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

Pilton88

Ahi pude hacer mi animacion de lo mas perfecto, con el metodo de EX3.

PD: Aprovecho para otra duda pequeña. Resulta que mi idea, es hacer un juego con la estructura parecida al argentum (no digo hacerlo de un dia para el otro xd). Lo cual, me gustaria que lo que el modo de video abarque una parte de la pantalla nada mas..., y lo demas estara compuesto por un image, un rich textbox... y otros controles nesesarios.
Como puedo hacer eso?
Ya que, cuando inicializo el modo de video:
IniGfx = m_gfx.Init(PicView.hWnd, PicView.ScaleWidth, PicView.ScaleHeight, , True)

El modo de video se me corre justo en el centro del formulario.

Otro problema que tengo... estube viendo una solucion... pero no la encuentro yo por lo menos, resulta que teniendo este grafico:


En la animacion, mirando para la izquierda o derecha, se nota un efecto violeta (que justo coincide que al costado derecho esta ese color).
Se puede solucionar de una forma bastante sencilla, que es pintando esa parte violeta en negra, con un programa de diseño grafico, pero al tener ya varias animaciones asi (con ese colorcito al costado), seria muy pesado andar imagen por imagen arreglandolo.
Las medidas, si bien no me equivoco, son para cada cuadro:
25 de ancho
45 de alto

Gracias desde ya..

RobiHm

Pegando otros formularios con los controles al de la imágen (claro está no podrás activar el modo screen completo y es muy tiñoso)...

Para agregar al interfaz en la misma pantalla del juego, según tengo entendido, tienes que hacerlos tú a mano, detectando colisiones del ratón con las cajas que tu dibujes y tal... por el foro andan unos cuantos post que lo explica

P.D.1
No te ofendas... pero viendo el nivel de control que tienes de vb y sumandole que acabas de empezar con dx_lib32 y en especial con todo lo referente a gráficos y juegos y tal...

te recomiendo que empieces por hacer un jueguecillo más básico y no por el AO...

P.D.2
El AO es open source, por lo tanto puedes mirarte el código y comprobar como soluciona las cosas para adaptarlas a lo que quieres...
Web : Indómita
Blog : MiBlog
Evobas : Evobas
Kobox : Kobox

Pilton88

No Robhim, quedate tranqui que toda critica constructiva no viene mal.
Igualmente, estoy afanando los graficos del ao, para hacer animaciones, cargar los mapas con tiles... etc.
Pero no quiero hacer el ao de una =P
Igual me considero que tengo un nivel bastante bueno en VB, lo que pasa es que me ven bastante corto con esto de los juegos, ya que es algo muy aparte de lo que es la programacion comun y corriente.
Al principio me van a tener que aguantar con estas dudillas XD.
Bueno, gracias por la info, y repito, no me ofende ninguna critica constructiva.
Desde ya gracias EX3 y Robhim.






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.