| Votar por el foro |  | | Web amiga |  | | | Animaciones | Dom Jul 27, 2008 2:05 pm por Anonymous | 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 podrá 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:
| Código: | --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. Después 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 código como comienzo para tus propios programas. La función “System.usbDiskModeActivate()†al comienzo activa el USB, y la comprobación de la tecla start sale del bucle. Si cargas este programa como script.lua desde el directorio raíz del Lua player, la tecla start reiniciara el programa, asi podrás acceder al archivo,modificarlo con un editor de textos y reiniciarlo para ver los cambios. mientras que si lo ejecutas desde lowser te debolverá a este mismo.
Ahora un programa para animar el smiley:
| Código: | --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, después 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, sería mas rapido usar una técnica 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 estáticas de tu juego en esta imagen y en cada bucle despues del vblank, primero dibujé el fondo en pantalla, después la imagen con las partes estáticas y finalmente las partes dinámicas.
Por mordi
| | Comentarios: 0 |
| | Estadísticas | Tenemos 3 miembros registrados. El último usuario registrado es nicog_777.
Nuestros miembros han publicado un total de 43 mensajes. en 42 argumentos.
| | ¿Quién está en línea ? | En total hay 1 usuario en línea: 0 Registrados, 0 Ocultos y 1 Invitado Ninguno La mayor cantidad de usuarios en línea fue 4 el Miér Sep 03, 2008 10:53 am. |
|