Programación
Índice­Portal­FAQ­Buscar­Miembros­Grupos de Usuarios­Registrarse­Conectarse
Buscar
 
 

Resultados por:
 
Rechercher Búsqueda avanzada
Votar por el foro
Web amiga
Últimos temas
» Como instalar compilador de C sin problemas (PSPDev)
Lun Oct 06, 2008 10:50 pm por nicog_777

» Sonido de PSP
Dom Jul 27, 2008 2:13 pm por Anonymous

» Controles de la psp
Dom Jul 27, 2008 2:09 pm por Anonymous

» Animaciones
Dom Jul 27, 2008 2:05 pm por Anonymous

» Prerequisitos y consejos
Dom Jul 27, 2008 2:00 pm por Anonymous

» Parte11-Fragmentos de código Lua (Snippet)
Dom Jul 27, 2008 1:56 pm por Anonymous

» Parte10-Fragmentos de código Lua (Snippet)
Dom Jul 27, 2008 1:51 pm por Anonymous

» Parte9-Fragmentos de código Lua (Snippet)
Dom Jul 27, 2008 1:48 pm por Anonymous

» Parte8-Fragmentos de código Lua (Snippet)
Dom Jul 27, 2008 1:45 pm por Anonymous

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&aacute 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.