Desarrollo de Juegos de Tablero (4 y 5): Autómata para Animación del personaje y/o fichas (4º parte)
En esta entrada, vamos a desarrollar varias animaciones para el personaje. Nuestro personaje va a tener 3 estados:
- - Parado
- - Andando hacia la izquierda
- - Andando hacia la derecha
Cada estado tiene su propia animación, con lo cual nuestro personajes o fichas, las tienes que ir almacenando. El estado inicial del personaje es "Parado", y si se mueve a una casilla cambia de estado. Si por ejemplo, va hacia la derecha de la pantalla, su estado cambia a "Andando hacia la derecha", y se animará con esos sprites. Cuando llegue a la casilla de destino cambiará de estado y volverá a estar en el estado "Parado".
¿Como implementar todo esto?
1º Creamos una nueva clase que contiene la lista de estados posibles, la clase "EstadosPosibles":
' Gambas class file
Public Parado As Integer = 1Public AndarDerecha As Integer = 2Public AndarIzquierda As Integer = 3
Esto nos facilitará en el futuro ampliar los estados posibles, y además ayuda a escribir el código en el IDE de gambas
2º Creamos otra clase "EstadoAnimacion" que se encargará de llevar la lista de animaciones para usarla por el personaje:
' Gambas class fileProperty estado As StringPrivate hestado As String
Public GaleriaAnimacines As New Collection
Private Function estado_Read() As StringReturn hestadoEnd
Private Sub estado_Write(Value As String)hestado = ValueEnd
Public Sub CambioEstado(cadena As String)hestado = cadenaEnd
Public Sub animacionActual() As AnimacionReturn GaleriaAnimacines[hestado]End
Como veis en los objetos de esta clase, almacenamos tanto el estado en que este el personaje como la lista de animaciones. Para ellos internamente usamos una colección "GaleriaAnimacines", siendo su key (o llave) el estado (hestado). (enlace al curso de gambas: uso de colecciones en gambas3)
A la clase "PiezaAnimada", vamos a hacer varios cambios:
- A su constructor _new() le cambiamos los parámetros de entrada, porque anteriormente lo habíamos codificado para que admitiera los datos de una animación. Ahora como vamos a manejar varios, crearemos un objeto público de la clase "EstadoAnimacion" para añadirselos:
Public Sub _new(ficheroRutaEnTablero As String, ptablero As DrawingArea)…end
'------------------ estados de animacion -----------------Public miEstadoAnimacion As New EstadoAnimacionPublic miEstado As New EstadosPosibles'---------------------------------------------------------
- Tendremos un nuevo método para asignar la animación que deberá usar para cuando se dibuje:
Public Sub ActualizaAnimacion(estado As String)
AnimacionTmp = miEstadoAnimacion.GaleriaAnimacines[estado]
End
- El método "Mueve": lo modificamos para que cuando la casilla este hacia la izquierda, cambie la animación a la izquierda, y viceversa.
Public Sub Mueve(casilla As Integer)….difx = (casillafinalX - casillaInicialX) / puntosdify = (casillafinaly - casillaInicialy) / puntosIf difx < 0 ThenActualizaAnimacion(miEstado.AndarIzquierda)ElseActualizaAnimacion(miEstado.AndarDerecha)EndifcontadorA = 0end
Además aparece un nuevo contador "ContadorA", que llevará la cuenta de los incrementos que lleva la animación (esta la usaremos en el método actualizaposición() )
- Tambien cambiamos el método de actualizaPosicion(), para que cuando llegue a la casilla destino, cambie la animación al estado "parado":
Public Sub actualizaPosicion()
If casillaFinal = casillaInicial Then Return 'a llegado a la casilla de destino
contadorA += 1pto.x = casillaInicialX + difx * contadorApto.y = casillaInicialY + dify * contadorA
If casillafinalX = pto.x And casillafinaly = pto.y ThencasillaInicial = casillaFinalmiEstadoAnimacion.CambioEstado(miEstado.Parado)AnimacionTmp = miEstadoAnimacion.animacionActual()Endif
End
- La Clase Jugador:
Para facilitar y "abstraer" el uso de estas nuevas clases y métodos, vamos a crear una nueva clase "interface" que usaremos como clase Padre, llamada Jugador, para manejar los método de los objetos de PiezaAnimada:
' Gambas class file
Public MiPiezaAnimada As PiezaAnimada
Public miEstado As New EstadosPosibles
Public Sub _New()
End
Public Sub dibuja()
MiPiezaAnimada.dibuja()
End
Public Sub actualizaPosicion()
MiPiezaAnimada.actualizaPosicion()
End
Public Sub Mueve(casilla As Integer)
MiPiezaAnimada.Mueve(casilla)
End
Esta clase es muy útil, ya que tiene el método constructor (_new()) sin definir. Crearemos tantas clases que hereden de este "Jugador" como tipo de personajes tengamos (enemigos, soldados, tanques, cañones, etc), así tendremos un constructor a la medida, osea con sus propias animaciones y en futuro añadirle sus propiedades y métodos específicos.
Por ejemplo la clase "JugadorAzul", la definimos asi:
' Gambas class file
Inherits Jugador
Public Sub _New(ficheroRutaEnTablero As String, ptablero As DrawingArea)
Dim animacionTmp As Animacion
Me.MiPiezaAnimada = New PiezaAnimada(ficheroRutaEnTablero, ptablero)'agrego distintas animaciones
'Andando a la derechaanimacionTmp = New Animacion("jacinto.png", 4, 7, "0,1,2,3,2,1,0,4,5,6,5,4,1")Me.MiPiezaAnimada.miEstadoAnimacion.GaleriaAnimacines.Add(animacionTmp, Str$(Me.miEstado.AndarDerecha))
'Parado...animacionTmp = New Animacion("jacinto.png", 4, 7, "26,26,26,26,26,26,26,0,0,0,0,0,0,26,26,26,26,26,26,26,7,7,7,7,7,7")Me.MiPiezaAnimada.miEstadoAnimacion.GaleriaAnimacines.Add(animacionTmp, Str$(Me.miEstado.Parado))
'Andando a la derechaanimacionTmp = New Animacion("jacinto.png", 4, 7, "7,8,9,10,9,8,7,11,12,13,12,11")Me.MiPiezaAnimada.miEstadoAnimacion.GaleriaAnimacines.Add(animacionTmp, Str$(Me.miEstado.AndarIzquierda))
'digo cual es el estado inicial.Me.MiPiezaAnimada.miEstadoAnimacion.estado = Me.miEstado.Parado'actualizo animacionMe.MiPiezaAnimada.ActualizaAnimacion(Me.miEstado.parado)
Me.Mueve(0) 'Me pongo en la casilla 0
End
De esta manera definimos sus animaciones correspondiente y usaremos los métodos de la clase interface "Jugador", para realizar las distintas tareas que tenga que hacer la ficha o personaje.
Os dejo un video que muestra lo explicado, ya en funcionamiento:
Enlace del código fuente: alojado en code google
Ya hemos acabado con el tema de animación de personajes/fichas, en el próximo artículo entraremos en la dinámica del juego de tablero y como programarlo, osea que cuando llegue el personaje a una casilla del tablero, pasará algo en el juego:
- caemos en una casilla de "pregunta": si acertamos, dará puntos al personaje , sino, perderemos puntos.
- caemos en una casilla de otro jugador: nos hacen pagar un tributo o se produce un combate, por ejemplo.
- caemos en una casilla y esta nos envía a otra casilla del tablero (la cárcel , o avanzamos o retrocedemos en el tablero)
- etc.
Saludos
Julio