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:
Dibuja los objetos de una capa usando reglas definidas por el usuario
Traducción:
-dibujar en azul, y leyenda "TRANSFERI.." cuando el campo "TRASFERIDO" contenga el valor "SI" y da igual que sea minusculas o mayusculas (por eso usa ILIKE)
-dibujar en rojol, y leyenda "POSIBLE E..." cuando el campo " POSIBLE E" contenga el valor "SI" y da igual que sea minusculas o mayusculas (por eso usa ILIKE)
-dibujar en negro, y leyenda "CHG" cuando el campo "FUNCIONABI" contenga el valor "CHG" y da igual que sea minusculas o mayusculas (por eso usa ILIKE)
Truco:
Se puede guardar el estilo y recuperlo para otro proyecto.
Nota:
%=es como un asterisco, y representa cualquier numero de caracteres
ILIKE puede trabajar entre mayusculas y minusculas
En esta 2º parte, vamos a ver un método mejor para animar los personajes o fichas en nuestro juego. Para ello vamos a trabajar con la misma imagen "jacinto" que teníamos anteriormente, pero nuestro código (esta vez usando clases), se va a encargar de hacernos el trabajo más fácil. Observar este esquema:
Cada Sprite (o cuadro) que es la pequeña imagen que forma la animación, lo tenemos en una regilla, donde podemos identificarla por el lugar de la fila y columna que ocupa en la imagen completa.
Crearemos las siguientes clases:
imagen: encargada de leer el archivo gráfico, y de dibujar solo el sprite actual (o cuadro indicado)
controlAnimacion: encargada de llevar el contador de la animación, ya que le pasaremos una lista de sprites (o cuadros) que forman la animación, y internamente llevará un contador para saber cual sprite es el actual.
animacion: esta clase contiene a dos objetos, uno tipo imagen y otro controlAnimacion, y funciona como una "fachada" para que el programador no tenga que usar directamente a las clases de más bajo nivel (imagen y controlAnimacion).
Clase:
Imagen
métodos
Parámetros
Descripción
_new()
ruta
indica la ruta donde esta la imagen
filas
indica las filas de sprites que tiene la imagen
columnas
indica las columnas de sprites que tiene la imagen
dibujar()
cuadro
numero que indica el sprite que se tendrá que dibujar
posx
coordenada X donde se dibujará sprite
posy
coordenada Y donde se dibujará el sprite
SpriteAltoAncho()
devuelve el ancho y largo del Sprite (según el numero de filas y columnas)
Usa una variable point, para devolver los valores:
x es el ancho e y es el alto
Clase:
ControlAnimacion
métodos
Parámetros
Descripción
_new()
Frames
cadena de texto, que indica que sprite hace el movimiento: “1,2,3,2”
cuadro()
Devuelve el numero de sprite actual
es_primer_cuadro()
Devuelve Verdadero o falso, si el contador de sprite paso es 0 o no
avanzar()
Avanza el contador interno paso, y si llega al último vuelve a 0
Clase:
Animacion
métodos
Parámetros
Descripción
_new()
ruta
indica la ruta donde esta la imagen
filas
indica las filas de sprites que tiene la imagen
columnas
indica las columnas de sprites que tiene la imagen
Frames
cadena de texto, que indica que sprite hace el movimiento: “1,2,3,2”
Este constructor, crea internamente dos objetos (itmp y ControlAnimaciónTmp), con los datos de los parametros pasados.
animar()
llama al método avanzar, del objeto interno ControlAnimacionTmp
pasoApaso
x
coordenada X donde se dibujará sprite
y
coordenada Y donde se dibujará el sprite
Se encarga de dibujar la imagen y avanzar la animación.
SpriteAltoAncho()
devuelve el ancho y largo del Sprite (según el numero de filas y columnas)
Usa una variable point, para devolver los valores:
A la hora de dibujar, también he cambiado algunas cosas:
Uso un drawingArea, que tiene el evento _draw, donde coloco los objetos a dibujar (los personajes, explosiones, etc):
PublicSubDrawingArea1_Draw()
figuraAnimada.dibuja()'es
una pieza en el tablero, que podemos mover. ani1.pasoApaso(100,
100) 'es una animación simple ani2.pasoApaso(200,
200)'es una animación simple ani3.pasoApaso(200,
100)'es una animación simple ani4.pasoApaso(100,
200)'es una animación simple ani5.pasoApaso(300,
100)'es una animación simple End
En el video se muestra varias animaciones ejecutandose a la vez:
Esto permite animar a la vez varias figuras y animaciones que haya en dicho procedimiento. Además ese evento _Draw es llamado cada cierto tiempo por un temporizador (timer1), que se encarga de actualizar también la posición de los figuras :
PublicSubTimer1_Timer() figuraAnimada.actualizaPosicion()'actualizamos
la posicion de la ficha. Internamente si no hay cambios se dibujara
en el mismo sitio DrawingArea1.Refresh() End
En la clase PiezaAnimada, el método .actualizaPosicion() se va calculando la posición de la figura, mientras se mueve entre casilla y casilla.
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=casillaFinalEndif End
Anteriormente el método .mueve() ha calculado cual es el incremento de X (difx) y el incremento de Y (dify), que se necesita para ir de la casilla actual a la casilla que se le haya indicado.
En el siguiente video vemos como se desplaza el personaje, a la vez que se hay otras animaciones reproduciendose:
El siguiente paso es implementar varios "estados" (osea varias animaciones a un mismo personaje/ficha), por ejemplo, cuando este parado, cuando vaya de izquierda a derecha o viceversa... para ello vamos a programar un autómata :)
Hemos visto como podemos dibujar en un drawingArea, pero una de las cosas que se nos pueden plantear es guardar lo que hemos hecho.
Para hacerlo se siguen los siguientes pasos usando el método .begin de la clase Paint:
- creamos una imagen de las mismas dimensiones que el drawingarea que contiene el dibujo
fichero = New Picture(drawingArea1.w, drawingArea1.h, Color.Transparent)
- Usamos el método .begin de la clase pain indicandole la imagen donde vamos a guardar el dibujo.
Paint.begin(fichero)
- Llamamos a la subrutina que hace el dibujo
dibujar()
-Terminamos de dibujar
Paint.end
-Salvamos el dibujo en un archivo:
fichero.save(user.home & "/" & "pruebas.png")
Ejemplo Completo:
Vamos a dibujar un rectangulo, una imagen y un texto en un drawingarea:
El contenido del drawingArea lo vamos a guardar en el fichero "pruebas", en el directorio del usuario. Además queremos darle la opción al usuario que guarde el fondo transparente o relleno en el color blanco (color.white).