Trucos sobre manejo de softwarelibre y gnu linux. También a los programas que hago en gambas3, python, java, etc.... Consejos y trucos sobre otros programas: excel, word, internet, instalación de programas, Arduino y demás....
Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic
Consultas, Desarrollo de programas y petición de presupuestos:
La idea de este programa es de usarlo para hacer tutoriales de juegos de tableros sin tener fisicamente el juego sino imagenes de los tableros y fichas. Tambien se podria usar para explicar juegos de cartas.
Esta es una versión alpha, pero espero ir añadiendo opciones y nuevas herramientas al programa.
gbCluedo, es una variante del juego Cluedo, para un solo jugador, donde deberás investigar haciendo sugerencias para descubrir cual fue el asesino del Dr.Lemon, haciendo preguntas sobre personaje, lugar y arma..
Empezamos el año 2017, con un juego de temática Star Wars, del tipo 4X (eXploración, eXpansión, eXplotación de recursos y eXterminación del enemigo). ¡¡¡ Conquista planetas, para conseguir más naves, y gana al imperio galáctico. !!!
Aqui teneis el instalador .deb alojado en gdrive: descarga
El proyecto de gplanet, con su código fuente está alojado en github en la siguiente dirección:
En esta página web botemania además de tener acceso a cientos de juegos, podeís también jugar a juegos gratuitos, que os den premios sin tener que arriesgar vuestro dinero. Os dejo dos videos sobre los juegos que hay actualmente: Tiki Toka Binco y La Tikipesca del Día
Nota: Siempre hay que dejar un saldo mínimo (yo tengo 0.05 euros) para poder jugar.
Os traigo un juego de turnos sobre combates de pokemon. Me he basado en el código que ha realizado de Pacman y que ha subido al foro http://gnulinuxvagos.es/ . Este esta escrito en C, y para la terminal. Yo lo he adaptado a gambas3, dándole un aspecto gráfico.
Os dejo un video para que veáis como se juega un combate:
El código es simple, y se puede ampliar y mejorar mucho, os dejo los enlace de descarga, tanto del instalador .deb como del código fuente en gambas3 (versión de gambas3 3.5.4)
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 PublicParadoAsInteger=1PublicAndarDerechaAsInteger=2PublicAndarIzquierdaAsInteger=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 filePropertyestadoAsStringPrivatehestadoAsString PublicGaleriaAnimacinesAsNewCollection PrivateFunctionestado_Read()AsStringReturnhestadoEnd PrivateSubestado_Write(ValueAsString)hestado=ValueEnd PublicSubCambioEstado(cadenaAsString)hestado=cadenaEnd PublicSubanimacionActual()AsAnimacionReturnGaleriaAnimacines[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:
PublicSub_new(ficheroRutaEnTableroAsString,ptableroAsDrawingArea)…end '------------------
estados de animacion -----------------PublicmiEstadoAnimacionAsNewEstadoAnimacionPublicmiEstadoAsNewEstadosPosibles'---------------------------------------------------------
- Tendremos un nuevo método para asignar la animación que deberá usar para cuando se dibuje:
PublicSubActualizaAnimacion(estadoAsString) 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.
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":
PublicSubactualizaPosicion() IfcasillaFinal=casillaInicialThenReturn'a
llegado a la casilla de destino contadorA+=1pto.x=casillaInicialX+difx*contadorApto.y=casillaInicialY+dify*contadorA IfcasillafinalX=pto.xAndcasillafinaly=pto.yThencasillaInicial=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 InheritsJugador PublicSub_New(ficheroRutaEnTableroAsString,ptableroAsDrawingArea) DimanimacionTmpAsAnimacion Me.MiPiezaAnimada=NewPiezaAnimada(ficheroRutaEnTablero,ptablero)'agrego
distintas animaciones 'Andando
a la derechaanimacionTmp=NewAnimacion("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=NewAnimacion("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=NewAnimacion("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:
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.
Desarrollo de Juegos de Tablero (1): Movimientos de fichas en tableros de rutas
Voy a dedicar varias entradas del blog a la programación de un juego de tablero. Y esta entrada va dedicada a como mover las fichas por un tablero.
Hay juegos donde los movimientos son bastante simples de programar, ya que consisten en cambiar la fila y/o de columna, mediante movimientos diagonales, horizontales o combinando ambos. Un ejemplo de ello son los juegos de damas o ajedrez:
Pero para otros juegos donde los movimientos de las piezas son caminos o rutas a seguir, el problema se complica:
Juego de la Oca: el camino de la fichas es una espiral
Tablero de un juego de carreras de coches
En estos casos, cada casilla tiene una coordenada donde se pueden colocar la pieza (o varias piezas). Incluso dependiendo de la ficha que usemos (un coche, una nave espacial) una dirección hacia donde avanza.
En el siguiente vídeo podéis ver como uso un pequeño programa para:
1) Tomar datos del tablero, para saber donde esta cada casilla donde irán colocada cada ficha del juego.
2) Cargar los datos del tablero y poder mover una pieza por este.
El código fuente lo podéis descargar al final del articulo.
Lo más interesante del código es la clase "Pieza":
- Mediante su constructor ( _new() ) que recibe el nombre del archivo donde estan los datos de las casillas y posiciones, el picturebox que usa como ficha que se va a desplazar, y el picturebox que contiene el tablero actual. Este médoto se encarga de cargar la información y poner la pieza en la casilla "0"
- Método Mueve(): traslada la posición de la ficha a una casilla indicada,
- Método recoretablero(): mueve la ficha por todo el recorrido del tablero, osea por todas las casillas.
Descripción del código de la clase Pieza:
'
Gambas class file
PrivatehcoordenadasAsString[]
PrivatepicttmpAsPicturebox
PrivatehptableroActualAsPictureBox
PrivateTableroOriginalNombreAsString
PrivateTableroOriginalAnchoAsInteger
PrivateTableroOriginalAltoAsInteger
PrivateTableroOriginalXAsInteger
PrivateTableroOriginalYAsInteger
PropertyPosicionAsInteger'devuelve
la casilla donde esta la pieza
El formulario principal se encarga de:
1) Cargar el dibujo del tablero
2) Definir y guardar los datos de la ruta que seguirán las piezas
3) Cargar datos de una ruta (definida en el paso 2)
4) Mover la ficha a una casilla indicada
5) Recorrer con la ficha el tablero (para ver la ruta completa que seguirá la ficha)
6) Mostrar en que casilla esta nuestra ficha.
Este es el código fuente:
'
Gambas class file
PublicdefinirAsBoolean
'define
PublicnumeroCasillaAsInteger
'contador para indicar la casilla donde esta el puntero del raton