¿Alguna vez te han dado ganas de programar un RPG?, porque a mi sí. Los Sprites son imagenes que simulan una animación. En el desarrollo de mi nuevo proyecto he logrado hacer animaciones de mi personaje caminando por pantalla. Por el momento es muy primitivo, pero vale la pena compartir este conocimiento con todos los interesados en Lua. Si te interesa mover sprites, sin usar timers, sigue leyendo.
Antes que nada quiero agradecer a Akabane87, creador de Sprite Maker. Las imágenes usadas en el programa de ejemplo son nativas de su magnifica aplicación.
En mi caso las imágenes las obtuve de la aplicación mencionada arriba, aunque puedes crear tus propios Sprites, con Photoshop, por ejemplo (O si prefieres con Paint xD). Existen distintas formas de Sprites, hay plantillas que incluyen todas las imágenes necesarias, como las generadas con Sprite Maker o puedes ser imágenes separadas.
Desconozco si Lua es capaz de cargar los tipos de Sprites que vienen en forma de plantilla, por eso recorté los 16 movimientos de la plantilla de Sprite Maker, dejándolos cada uno en una imágen PNG.
Los personajes vienen en la raíz del programa de ejemplo. Podrás apreciar que vienen nombrados siguiendo cierto patrón:
Esto es por cuestiones prácticas de organización.
Ya conociendo como organizo y obtengo sprites puedo proceder a explicar el meollo del asunto: el código.
Pido de favor, que si vas a usar mi código para una creación tuya, no me robes el crédito xD, me basta con un pequeño "saludo" en los créditos jeje.
Analizemos la primera parte del Script (Ubicado en la carpeta System del programa de ejemplo)
s1f=Image.load("./1f.png") s2f=Image.load("./2f.png") s3f=Image.load("./3f.png") s4f=Image.load("./4f.png") s1d=Image.load("./1d.png") s2d=Image.load("./2d.png") s3d=Image.load("./3d.png") s4d=Image.load("./4d.png") s1i=Image.load("./1i.png") s2i=Image.load("./2i.png") s3i=Image.load("./3i.png") s4i=Image.load("./4i.png") s1a=Image.load("./1a.png") s2a=Image.load("./2a.png") s3a=Image.load("./3a.png") s4a=Image.load("./4a.png")
En esta parte no se hace más que cargar imágenes, como ves sigo el mismo patrón de las imagenes con las variables. Sólo que con el prefijo "s" que podemos interpretar como "sprite"
S={} S[1]={x=100,y=100} sprite=s1f pasosd=0 pasosi=0 pasosf=0 pasosa=0
Después creamos un tabla, esta es imporatante, ya que podremos mover al personaje a través de sus variables. Ojo: Mover el personaje, no cambiar las imágenes para simular la animación.
Después creamos 5 variables:
sprite=s1f Esta variable es la más importante, es la que mostraremos en pantalla, con ayuda de una función, su valor cambiará para mostrar diferentes imágenes en diferentes situaciones. Tiene asignado el valor "s1f", que es una imágen, regresa y mira los nombres de las imágenes.
pasosd=0 Esta variable contará, digamos, los pixeles que pasan por el personaje. Así podremos establecer que si se pasan 10 pixeles a la derecha (d) cambie de imagen. Lo mismo sucede con pasosi, pasosf y pasosa.
function mov() if pad:right() then S[1].x = S[1].x +2 pasosd = pasosd + 1 end if pad:left() then S[1].x = S[1].x -2 pasosi = pasosi + 1 end if pad:up() then S[1].y = S[1].y -2 pasosa = pasosa + 1 end if pad:down() then S[1].y = S[1].y +2 pasosf = pasosf + 1 end end
Otra función importante. Establece que si, se presiona el pad digital a X dirección, la variable x de la imagen se incrementará o se disminuirá, sólo moverá la imagen por la pantalla. Y se sumará 1 la variable "pasosX", si releemos arriba nos enteraremos por qué se suma 1 a la variable.
function sprd() if pasosd >= 0 and pasosd < 10 and pad:right() then sprite=s1d end if pasosd >= 10 and pasosd < 20 and pad:right() then sprite=s2d end if pasosd >= 20 and pasosd < 30 and pad:right() then sprite=s3d end if pasosd >= 30 and pasosd < 40 and pad:right() then sprite=s4d end if pasosd >= 40 then pasosd=0 end end
Esta función cambiará la imagen si se cumplen ciertas condiciones, esto dará origen a la animación. Si "pasosd" es mayor o igual a 0 pero menor a 10 y se presiona el pad a la derecha, la imagen almacenada en "sprite" cambiará. Este proceso se repite con diferentes posiciones e imagenes hasta que "pasosd" llegue a 40, entonces el contador se reiniciará, repitiendo el proceso infinitamente.
Las siguientes funciones son idénticas a la anterior, no vale la pena explicarlas, basta con que las leeas bien, y pongas mucha atención.
function spri() if pasosi >= 0 and pasosi < 10 and pad:left() then sprite=s1i end if pasosi >= 10 and pasosi < 20 and pad:left() then sprite=s2i end if pasosi >= 20 and pasosi < 30 and pad:left() then sprite=s3i end if pasosi >= 30 and pasosi < 40 and pad:left() then sprite=s4i end if pasosi >= 40 then pasosi=0 end end
function sprf() if pasosf >= 0 and pasosf < 10 and pad:down() then sprite=s1f end if pasosf >= 10 and pasosf < 20 and pad:down() then sprite=s2f end if pasosf >= 20 and pasosf < 30 and pad:down() then sprite=s3f end if pasosf >= 30 and pasosf < 40 and pad:down() then sprite=s4f end if pasosf >= 40 then pasosf=0 end end
function spra() if pasosa >= 0 and pasosa < 10 and pad:up() then sprite=s1a end if pasosa >= 10 and pasosa < 20 and pad:up() then sprite=s2a end if pasosa >= 20 and pasosa < 30 and pad:up() then sprite=s3a end if pasosa >= 30 and pasosa < 40 and pad:up() then sprite=s4a end if pasosa >= 40 then pasosa=0 end end
Después sólo resta poner el bucle principal.
while true do pad = Controls.read() screen:clear() mov() sprd() spri() spra() sprf() screen:blit(S[1].x,S[1].y,sprite) if pad:start() then break end screen.waitVblankStart() screen.flip() end
Primero activamos los controles. Limpiamos la pantalla para hacerla funcional. Llamamos a todas las funciones. Y mostramos la imagen, fíjate que se estan usando las variables de la tabla de arriba como ejes X e Y, i se está mostrando "sprite", que, directamente, no es una imágen sino una variable, por lo tanto se mostrará la imágen almacenada en esa variable, con esto quedan más claras las funciones. Finalmente se establece que a presionar Start se romperá el script, reiniciando el código.
Captura del programa
Espero que este tutorial ayude a más de uno. Gracias por leer.
Dejo un ejemplo de la aplicación de este código, está listo para extraerese en la raíz de la Memory Stick. Puedes mirar el código directamente del archivo System.lua, ubicado en la carpeta System.
El código expuesto en este tutorial, y en el programa está hecho por mí, no se ha recurrido a otras fuentes para este tutorial.
Descargar Programa de Ejemplo (Sólo Usuarios Registrados)
Comentarios
serviria en luadev?
serviria en luadev?
TODO
Todo Lo Que Este Programado En LuaHm Sirve En LuaDev, Lo Unico Seria Que Cambies Las Funciones De Hm Por Las De DEV.
bloqueo
¿Y como se hace para que cuando llegue a la poscion x 480 no puede pasar?
Resta
La anchura del jugador por la anchura de la pantalla, y resta la latura del jugador por la altura de la pantalla.
Tan sencillo como eso.
Manual del Perfecto Votante Para un voto libre y justo!.
TheGCProjects
No
Me refiero a que si choca con x 480 debe de empezar de nuevo el bucle. Solamente lo hago para la derecha. Va por timers.
¿que programa usaste para recortar?
esque necesito recortar las imagenes para hacerlo como tu tutorial (no te preocupes tendras un hueco en mis creditos)
Perdón
Perdón por mi incompetencia, pero con Paint :P
descubrimiento asombrante
¿con paint???? asombrante, ya las separe, gracias por responder
como
como se hace para que el fondo del personaje del sprite sea transparente??
lo decia en otro tutorial de sprites pero no entendi ese tutorial, solo este.
Se a lo que
Te refieres, pero en Lua desconosco si se puede hacer eso, pero puedes usar fotoshop y quitarle el fondo al personaje y asi sera digamos transparente.
Manual del Perfecto Votante Para un voto libre y justo!.
TheGCProjects
pos vaya.
pos vaya,que lastima porque no tengo photoshop y no tengo ganas de buscarlo ahora.
pero, si mal no recuerdo, cuando ponias una imagen con screen:blint, no habia una opcion que era alpha?? para poner el color de la imagen transparente o algo??
muchas gracias.
Pues
Yo ambien lei eso, peor en tutoriales de programacion en C para psp, aunque tambien he oido algo sobre eso en lua, pero aun no lo he visto puesto en practica en algun script.
Saludos.
Manual del Perfecto Votante Para un voto libre y justo!.
TheGCProjects
Gracias tanos por el aporte,
Gracias tanos por el aporte, pero te informo de que LUA si carga sprites. No me preguntes como porque no lo se :P, pero lo hace. Pucelano sabe como hacerlo.
Saludos.
www.SceneBeta.com recomienda Mozilla FireFox.
Sprites
Lua puede cargar sprites de la siguiente forma con los siguientes argumentos en la funcion blit
screen:blit(x, y, imagen, coordenada X pixel de comienzo, coordenada Y pixel de comienzo, coordenada X pixel de final, coordenada Y pixel de final)
De forma que estableces en las dos primeros argumentos las coordenadas donde quieres situar la imagen, el tercer argumento escribes la variable de la imagen a pintar, los dos siguientes argumentos las coordenadas desde donde se empezara a tomar la imagen a mostrar de la imagen cargada de la variable, es decir la esquina superior, y los dos ultimos serian donde acaba la imagen que deseas que esta dentro de la imagen cargada.
No se si lo he dejado claro
screen:blit(10, 20, prueba, 15, 15, 30, 30)
en este ejemplo mostraria desde el pixel 15,15 hasta el pixel 30,30 de la imagen prueba en las coordenadas de la pantalla 10,20
EVO PSP = 2.01 > 2.60 > 1.5 > 3.02OE-A > 3.02OE-B > 3.03OE-A > 3.03OE-A' > 3.03OE-B > 3.03OE-C > 3.10OE-A > 3.10OE-A' > 3.52M33 > 3.52M33-2 > 3.52M33-3 > 3.52M33-4 > 3.71M33 > 3.71M33-3 > 3.7
uooo, mil gracias carlos!
uooo, mil gracias carlos!
Muy buen aporte
Gracias Tanos, esto me ayudara aun mas para programar.
Salu2 Paisano.