Anuncios Google

Animaciones

Tutoriales Avanzados Homebrewes

Comprender como se representan los pixeles en pantalla es importante para escribir juegos. La pantalla de la PSP, como muchas otras pantallas, tiene el mismo concepto que los antiguos tubos de imagen: Un haz de electrones comienza a barrer desde la esquina superior izquierda de la pantalla y va abanzando escaneando todas las lineas de arriba a abajo. (el amigo abismo que es electronico podra explicarlo mejor), cuando llega abajo necesita algun tiempo para volver al comienzo, esto es llamado vertical blank (vBlank), Por supuesto, en la PSP no existe realmente este haz de electrones, pero podemos pensar que funciona de esta manera, con el script "screen.waitVblankStart" hace que el programa espere hasta que comience el proximo barrido, durante esta espera, ningun pixel es escrito en la pantalla, lo que te da la oportunidad de intercambiar la screen y el offscreen para evitar parpadeos o destellos.

Vamos a ver como mostrar una animacion haciendo uso del intercambio sincronizado de pantallas:

--Activa el usb (esto no es realmente necesario)
System.usbDiskModeActivate()
--creamos un nuevo objeto de color verde
green = Color.new(0, 255, 0)
--variable time inicializada a cero
time = 0
--pi almacena 3,14... arcotangente de 1 (radian) * 4
pi = math.atan(1) * 4
--bucle infinito
while true do
  --limpia la pantalla al comienzo de cada barrido
  screen:clear()
  --vamos calculando el seno para cada momento time
  x = math.sin(pi * 2 / 360 * time) * 150 + 192.5
  --mostramos hola mundo en la posicion seno(time)
  screen:print(x, 100, "Hello World!", green)
  --incrementamos tiempo
  time = time + 1
  --volvemos a cero cuando el time supera 360
  if time >= 360 then
    time = 0
  end
  --esperamos al proximo escaneo
  screen.waitVblankStart()
  --intercambiamos las pantallas
  screen.flip()
  --si se pulsa start se sale del script
  pad = Controls.read()
  if pad:start() then
    break
  end
end

En el bucle while, primero se limpia el offscreen. Despues el texto se dibuja en la pantalla, se espera al siguente escaneo de pantalla, se intercambia el screen y el offscreen. En la PSP la velocidad de refresco es 60Hz, lo que significa que eltexto necesita 6 segundos para volver a empezar desde la misma posicion. (la funcion seno tiene un periodo de 2*pi, asi que para un periodo completo "time" necesita ir desde 0 a 360 y "time" se incrementa 60 veces por segundo, lo que significa que un periodo son 6 segundos). Finalmente se comprueba si se a pulsado start, que sale del bucle.

Puedes usar este codigo como comienzo para tus propios programas. La funcion "System.usbDiskModeActivate" al comienzo activa el USB, y la comprobacion de la tecla start sale del bucle. Si cargas este programa como script.lua desde el directorio raiz del Lua player, la tecla start reiniciara el programa, asi podras acceder al archivo,modificarlo con un editor de textos y reiniciarlo para ver los cambios. mientras que si lo ejecutas desde lowser te debolvera a este mismo.

Ahora lo haremos con imagenes, primero copia esta imagen como "background.png" en tu PSP:

y despues esta otra como "smiley.png":

Ahora un programa para animar el smiley:

--activa el usb
System.usbDiskModeActivate()
--objeto de color verde
green = Color.new(0, 255, 0)
--variable time puesta a cero
time = 0
--pi almacena 3,14..
pi = math.atan(1) * 4
--carga las imagenes(deben estar en la misma carpeta del codigo)
background = Image.load("background.png")
smiley = Image.load("smiley.png")
while true do
  --coloca la imagen background en las coordenadas 0,0
screen:blit(0, 0, background, 0, 0, background:width(), background:height(), false)
  --calcula x e y para cada momento de time
  x = math.sin(pi * 2 / 250 * time) * 200 + 220.5
  y = 172 - math.abs(math.sin(pi * 2 / 125 * time) * 150)
  --coloca smiley en las coordenadas calculadas x,y segun la funcion seno
  screen:blit(x, y, smiley)
  --varia time para tomar nuevas coordenadas
  time = time + 1
  --vuelve a poner el ciclo a cero
  if time >= 500 then
    time = 0
  end
  screen.waitVblankStart()
  screen.flip()
  pad = Controls.read()
  if pad:start() then
    break
  end
end

Puedes ver que la estructura general del bucle principal es muy parecida a la del ejercicio anterior. Pero en vez de llamar a "screen:clear()" se llama a "screen:blit" que dibuja una imagen de fondo, despues se llama a screen:blit"(x, y, smiley)" que dibuja otra imagen encima del fondo. Este tiene menos argumentos, esto es porque se utilizan los argumentos por defecto, lo que indica que alpha es true que indica que todos los pixeles transparentes de la imagen no son mostrados.

Si vas a crear varios objetos en pantalla, seri­a mas rapido usar una tecnica de varias capas: Crea una imagen vacia con "Image.createEmpty" (las imagenes vacias son creadas por defecto con todos los pixeles transparentes) dibuja las partes estaticas de tu juego en esta imagen y en cada bucle despues del vblank, primero dibuje el fondo en pantalla, despues la imagen con las partes estaticas y finalmente las partes dinamicas. Mira el juego de la serpiente como ejemplo de esto.

4.466665
Tu voto: Ninguno Votos totales: 4.5 (15 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

En vez de usar

en vez de usar math.atan(1) * 4 no se puede usar math.pi ???

Problema

Cuando ejecuto el HOLA MUNDO funciona tanto en windows como en el psp.

Pero por ejemplo cuando ejecuto la primera animacion, funciona correctamente en windows,  pero cuando lo pongo y corro en el psp, la pantalla se queda en blanco y no pasa nada, nisiquiera aparece un error ni nada.

(repito, en windows si funciona y aparece la animacion, de hecho copie el codigo tal cual y nada mas no me sirve en el psp... alguna recomendacion?)

 

 

Imagen de sting18

Usa una vercion de luaplayer

Usa una vercion de luaplayer compatible con la vercion de windows que tienes

Vuelvo a repetir

Vuelvo a repetir, el codigo SI FUNCIONA EN WINDOWS, cuando lo paso al PSP la pantalla del psp solo se pone negra y no pasa nada, ni aparece error ni nada.

 

(El primer ejemplo de hola mundo si funciono en en PSP)

problemas con Color.new

Buenos días, estoy trabajando con windows para poder terminar mi proyecto final de carrera con LUA, empleo el SCITE para compilar y ejecutar los programas y la versión de LUA creo que es una 5.01, o algo asi, el problema que tengo es que al utilizar la siguiente instrucción:

blanco= Color.new(255,255,255)

LUA me da un fallo tanto al compilar como al ejecutar, de hecho no me deja ejecutar, he leido ya en algun foro que al parecer esto se solucinoa con una versión del compilador LUAplayer HM7, he probado a buscar este compilador en internet y lo encuentro, pero al ir a instalarlo se me pide una clave que no tengo, sabeis alguna solucion "gratuita" para la solucion de este problema, muchas gracias por anticipado, un saludo

Imagen de -RG4M3R-

has intentado

poner espacio entre new y ( ???

Imagen de sting18

No tienes que poner espacio

No tienes que poner espacio solo new(xxxxxxxxx)

Imagen de pspgorrister

Lo que no entiendo es

Lo que no entiendo es porqué pones eso aquí en vez de abrir un nuevo hilo, en fin...  ¬¬

no entiendo el math.

no entiendo lo del math. , en el segundo ejemplo pusieron math.sin a x  y math.abs a y porqu??

Imagen de elcapaa

ola

nose dode meter las imagenes ago un carpeta al lado de script.lua llamda imagenes pero pongo todo bien cuando le doy a carga me sale

error: SCRIPT.lua:19:image,load:error loading image.

ayudarme PORVAFOR MESALE LO DE HELLO WORLD PARA LOS LADOS PORO ESTO NO. gracias por adelantado


cual es em mejor amigo del hombre... el perro NOOOOO la PSP

Imagen de cork_3run

error:

error: SCRIPT.lua:19:image,load:error loading image.

Claro es k as puesto image,load y es image.load

Imagen de Tanos

Mételos

En la misma carpeta que tu sript.

Imagen de frink

TENGO UN PROBLEMA

cuando copio todo y lo pongo en la psp me sale esto:

error: script.lua:3: '<eof>' expected near 'end'

 

me podriais ayudar ? 

 

pf 

Imagen de Tanos

Reviso los "end"

Revisa que cada if tenga un end, y que exista un end al final de while true do.

Imagen de Guillermo_Cornielle

puedes

Escribir tu codigo, para ver que es lo que esta mal, es que asi no te se decir.

Imagen de ..Dark__Jose..

Tengo un problema, he hecho

Tengo un problema, he hecho todo lo que se dice aquí, pero cuando iba a ejecutarlo en el lua player for windows, me dice esto.

No lo entiendo, quizás la haya liado en algo, si me podeis ayudar os mando el script y le echais un vistazo, por que no tengo ni idea.

PD: Soy principiante xD

Imagen de Tanos

Quieres usar fuentes

LuaPlayer de Windows no acepta esta característica.

Imagen de ALCales

Se puede poner esto al

Se puede poner esto al principio de un hombrew o algo parecido??

Como hago para que despues de la animacion continue una imgen o viceversa??

Muchas gracias y saludos¡¡


Imagen de Miguelinh0

Supongo que

se puede en un homebrew que este hecho en LUA.

Por el momento no sabria decirte como se hace, pero no lo creo imposible. 

Bug

Hay un error en el primer código de ejemplo, cuando declara la variable "verde", y luego al llamar esa variable llama a "green" en vez de a verde, por eso recomiendo cambiar la cuarta línea por esto:

green = Color.new(0, 255, 0)

Imagen de NITEMAN

Gracias por avisar

Ya esta corregido ;) os agradecemos que nos señaleis cualquier error que podamos tener.

Salu2 

"El paraíso a mi izquierda, el infierno a mi derecha y el ángel de la muerte tras de mi."


"El paraí­so a mi derecha, el infierno a mi izquierda y el ángel de la muerte tras de mi."

Imagen de Mc_JoRgE

No entiendo

No entiendo

math.atan

math.sin

 

podrias alludarme gracias :D

¿no sabeis en vez de que se

¿no sabeis en vez de que se mueva el smiley que cambie la imagen?

Imagen de mordi

Cambio de imagen

En este ejemplo, como el movimiento es continuo, da igual tener en cuenta las coordenadas o la variable time(que seria mas sencillo). Yo lo haria de la siguiente forma: un avariable booleana, y varialbles auxiliares para copiar los datos de x e y. Calculas x e y, los comparas con los anteriores valores, ¿son disitintos?(en este caso de movimiento continuo siempre sera si) entonces entras en un in en lugar de la linea en la que pintas la imagen:

 

if mibooleana==true then
   screen:blit(x, y, imagen1)
   mibooleana=false
else
  screen:blit(x, y, imagen2)
  mibooleana=true

 

Esto lo e puesto un poco a ojo, lo que intenta decir es que cada  que imprima la imagen en una posicion distinta, va a imprimir una imagen distinta,en este caso, solo se turnan dos imagenes, pero se podira hacer una animacion mas complicada usando muchas mas imagenes, siguendo un metodo muy parecido, aunque no nos seria tan util una booleana debido a su caracter binario. Espero que te sirva de ayuda para tener una idea de como hacerlo

 

--¡Un verdadero guerrero Klingon nunca utiliza comentarios en su código!--


¡Un verdadero guerrero Klingon nunca utiliza comentarios en su código!

pero todos los espacios del

pero todos los espacios del codigo hay que ponerlos al pie de la letra? es decir, los espacios que van delante de por ejemplo:

  screen:clear()

Imagen de Neo_Ace

Los que van delante no, pero

Los que van delante no, pero los demás sí.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.