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, seria 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.
Comentarios
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?)
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
has intentado
poner espacio entre new y ( ???
No tienes que poner espacio
No tienes que poner espacio solo new(xxxxxxxxx)
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??
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
error:
error: SCRIPT.lua:19:image,load:error loading image.
Claro es k as puesto image,load y es image.load
Mételos
En la misma carpeta que tu sript.
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
Reviso los "end"
Revisa que cada if tenga un end, y que exista un end al final de while true do.
puedes
Escribir tu codigo, para ver que es lo que esta mal, es que asi no te se decir.
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
Quieres usar fuentes
LuaPlayer de Windows no acepta esta característica.
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¡¡
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)
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."
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?
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()
Los que van delante no, pero
Los que van delante no, pero los demás sí.