En este tutorial vamos a aprender a usar funciones. Crear una función es como crear nuestro propio comando de Lua. Podemos usar funciones para secciones de código que se repiten y podemos llamarlas en cualquier momento. Las funciones se sitúan fuera del bucle principal. Un buen lugar es al comienzo del código, junto a las declaraciones de variables.
Lo primero que vamos a ver es como se declara una función. Examina el siguiente código:
function nombreFuncion() (codigo para ejecutar en la funcion. Se pueden usar multiples lineas) end
Ahora que has visto como se declara una función, veamos una función de ejemplo que mostrará un sencillo mensaje por pantalla cada vez que sea llamada:
function mostrarMensaje() screen:print(100,100, "Las funciones son divertidas!") end
Ahora, para mostrar este mensaje en un programa tendréamos que llamar a la función en cualquier parte del código cuando la queramos usar. Para la función anterior podemos usar el siguiente código que la llamará y ejecutará en código que hay dentro de la función una vez.
mostrarMensaje()
Esto ejecutará el código que contiene la función que hemos creado antes. "Las funciones son divertidas!" aparecerá en la pantalla al llamar a mostrarMensaje().
Cuando empieces a crear programas más complejos o juegos usarás mucho las funciones. Usar llamadas a funciones dentro del bucle principal hará que tu código sea muy limpio (gana en claridad).
Las funciones también pueden devolver un valor. Esto se hace metiendo argumentos entre los paréntesis de la función al ser declarada. Vamos a crear una función que use dos números y devuelva su suma. Ej:
function sumaNumeros(a, b) suma = a + b return suma end
Féjate que esta vez hemos puesto entre paréntesis las letras a y b. Podréamos haber usado cualquier letra o incluso palabras. Son variables que se usan dentro de la función y sólo existen dentro de ella. Como vamos a sumar dos números, necesitamos dos variables para almacenarlos. Puedes usar tantas variables como necesites en tus funciones, pero tienes que separarlas por comas. Dentro de la función hemos creado una variable llamada suma a la que asignamos el valor de la suma de las dos variables. Verás más claro su uso una vez que veas cómo se llama a la función. Tenemos también el comando return, que le dice a la función que estamos devolviendo un valor una vez que salimos de ella. En este caso el valor que estamos devolviendo es el de la variable suma. Ahora examinemos como podemos usar esto y explicaré un poco más. Mira este código:
screen:print(100,100,sumaNumeros(5,6), verde)
Esto mostrará el resultado de nuestra función en pantalla. Féjate que usamos números cuando llamamos a la función. Usamos 5 y 6 en este ejemplo. Esto asigna el valor 5 a la variable a y el valor 6 a b. Ahora en la función que declaramos antes, cada vez que usamos a o b, esas variables serán reemplazadas por los números que hemos puesto. Por lo tanto, en nuestra función cuando decimos suma = a + b, esto resuelve suma = 5 + 6. Se asignará, por lo tanto, el valor 11 a la variable suma y se devolverá al comando print, mostrándose por pantalla.
También podemos almacenar la información en una variable si fuera necesario. Asé podemos no usarla si no la necesitamos en ese momento, o podemos reutilizarla tantas veces como queramos sin tener que recalcular la función completa. Féjate:miTotal = sumaNumeros(5,6)
Esto almacenará el valor devuelto por nuestra función en la variable miTotal, por lo que valdrá 11.
Miremos el programa que hicimos en el anterior tutorial. Era algo asé:
hierba = Image.load("grass.png") jugador = Image.load("player.png") flor = Image.load("flower.png") anchoPantalla = 480 - jugador:width() altoPantalla = 272 - jugador:width() Jugador = { } Jugador[1] = { x = 200, y = 50 } while true do pad = Controls.read() screen:clear() for a = 0, 14 do for b = 0,8 do screen:blit(32 * a, 32 * b, hierba) end end screen:blit(100,100,flor) screen:blit(300,220,flor) screen:blit(Jugador[1].x,Jugador[1].y,jugador) if pad:left() and Jugador[1].x > 0 then Jugador[1].x = Jugador[1].x - 2 end if pad:right() and Jugador[1].x < anchoPantalla then Jugador[1].x = Jugador[1].x + 2 end if pad:up() and Jugador[1].y > 0 then Jugador[1].y = Jugador[1].y - 2 end if pad:down() and Jugador[1].y < altoPantalla then Jugador[1].y = Jugador[1].y + 2 end screen.waitVblankStart() screen.flip() end
Podemos hacer funciones para limpiar nuestro bucle principal para ver que pasa con más claridad. Podemos poner todas las comprobaciones de las direcciones dentro de una función. También podemos poner los blit en otra. Ninguna de las dos funciones devolverán un valor. Mira el siguiente código para comprobar como uso las funciones:
hierba = Image.load("grass.png") jugador = Image.load("player.png") flor = Image.load("flower.png") anchoPantalla = 480 - jugador:width() altoPantalla = 272 - jugador:width() Jugador = { } Jugador[1] = { x = 200, y = 50 } -- Funcion que comprueba los movimientos del jugador function movimientoJugador() pad = Controls.read() if pad:left() and Jugador[1].x > 0 then Jugador[1].x = Jugador[1].x - 2 end if pad:right() and Jugador[1].x < anchoPantalla then Jugador[1].x = Jugador[1].x + 2 end if pad:up() and Jugador[1].y > 0 then Jugador[1].y = Jugador[1].y - 2 end if pad:down() and Jugador[1].y < altoPantalla then Jugador[1].y = Jugador[1].y + 2 end end -- Funcion para mostrar imagenes en pantalla function mostrarImagenes() for a = 0, 14 do for b = 0,8 do screen:blit(32 * a, 32 * b, hierba) end end screen:blit(100,100,flor) screen:blit(300,220,flor) screen:blit(Jugador[1].x,Jugador[1].y,jugador) end -- Bucle principal while true do screen:clear() mostrarImagenes() movimientoJugador() screen.waitVblankStart() screen.flip() end
Mirando el código puedes ver que hemos limpiado nuestro bucle principal. Todo el código detallado ha quedado dentro de las funciones y nuestro bucle principal simplemente las llama. También puedes leer el código del bucle principal y saber que hace. Todo el desorden del anterior programa ha desaparecido del bucle principal y se ha movido al comienzo de nuestro código.
Espero que este tutorial te haya ayudado a aprender un poco sobre el uso de funciones. El posteriores tutoriales las usaremos más.
Comentarios
ok ya pase el 7 pero no los
ok ya pase el 7 pero no los estoy probando
Woow, tu si que tienes
Woow, tu si que tienes tiempo y eres super rápido. Yo apenas voy por el 4 :-P.
lo he cambia y me sigue dando error
lo he cambiado y me sigue dando error: '=' expected near '-'
ahora me dice eso.
edit: creo que ya he encontrado el error (gracias) pero sigue sin arrancar voy a buscar mas errors
me da un error
me da un error de que tengo un = demasiado cerca de un - y no lo entiendo pero lo he revisado cien veces y no encuentro ese error mirar vosotros aqui os dejo mi código:
--***** Utilizando funciones para limpiar el bucle principal *****
--Imágenes cargadas
jugador = Image.load("player.png")
hierba = Image.load("grass.png")
flor = Image.load("flower")
--Límites de la pantalla
altoPantalla = 272 - jugador:height()
anchoPantalla = 480 - jugador:width()
--Jugador
Jugador = {}
Jugador[1] = {x = 100,y = 100}
--Declaración de funciones
function mavimientoJugador()
pad = Controls.read()
if pad:left() and Jugador[1].x > 0 then
Jugador[1].x - 1
end
if pad:up() and Jugadro[1].y > 0 then
Jugador[1].y - 1
end
if pad:right () and Jugador[1].x < anchoPantalla then
Jugador[1].x + 1
end
if pad:down() and Jugador[1].y < altoPantalla then
Jugador[1].y + 1
end
function mostrarImágenes()
for a = 0, 14 do
for b = 0,8 do
screen:blit(32 * a, 32 * b, hierba)
end
end
screen:blit(100,100,flor)
screen:blit(300,220,flor)
screen:blit(Jugador[1].x,Jugador[1].y,jugador)
end
end
--Bucle principal
while true do
screen:clear()
mostrarImagenes()
movimientoJugador()
screen.waitVblankStart()
screen.flip()
end
Ya se
fijate bien, en el movimiento del jugador tuyo, y en este que te pongo a continuacion:
if pad:left() and Jugador[1].x > 0 then
Jugador[1].x = Jugador[1].x - 1
end
if pad:up() and Jugadro[1].y > 0 then
Jugador[1].y = Jugador[1].y - 1
end
if pad:right () and Jugador[1].x < anchoPantalla then
Jugador[1].x = Jugador[1].x + 1
end
if pad:down() and Jugador[1].y < altoPantalla then
Jugador[1].y Jugador[1].y + 1
end
Fijate bien, y veras el error.
Manual del Perfecto Votante Para un voto libre y justo!.
TheGCProjects
creo que ya se
ya he corrido unos errores que habia y ya he conseguido que arranque este es mi código:
jugador = Image.load("player.png")
hierba = Image.load("grass.png")
flor = Image.load("flower.png")
--Límites de la pantalla
altoPantalla = 272 - jugador:height()
anchoPantalla = 480 - jugador:width()
--Jugador
Jugador = {}
Jugador[1] = {x = 100,y = 100}
--Declaración de funciones
function movimientoJugador()
pad = Controls.read()
if pad:left() and Jugador[1].x > 0 then
Jugador[1].x = Jugador[1].x - 1
end
if pad:up() and Jugador[1].y > 0 then
Jugador[1].y = Jugador[1].y - 1
end
if pad:right() and Jugador[1].x < anchoPantalla then
Jugador[1].x = Jugador[1].x + 1
end
if pad:down() and Jugador[1].y < altoPantalla then
Jugador[1].y = Jugador[1].y + 1
end
end
function mostrarImagenes()
for a = 0, 14 do
for b = 0,8 do
screen:blit(32 * a, 32 * b, hierba)
end
end
screen:blit(100,100,flor)
screen:blit(300,220,flor)
screen:blit(Jugador[1].x,Jugador[1].y,jugador)
end
--Bucle principal
while true do
screen:clear()
mostrarImagenes()
movimientoJugador()
screen.waitVblankStart()
screen.flip()
end
habia unos fallos en la imagen cargada y un parentesis con un espacio de sobra (if pad:right () justo delante del parentesis puse un espacio de más)
Bueno
Creo, que el error estan(aunque no tiene que ver nada con el = y el -) en la parte del movimiento, en donde dice if pad up() an jugadro.
Ahi es donde esta mal, dice jugadro, y se ecribe jugador, o mejor dicho, asi se llama XD.
Manual del Perfecto Votante Para un voto libre y justo!.
TheGCProjects
muchas gracias
jope pues o me estan saliendo cataratas o me estoy volviendo tonto porque revisarlo 100 veces y no verlo
muchas gracias(tendre k ir al oculista)
ERROR
ya no hice este tuto bueno mejor dicho ya no lo lei me desanimo el error 80020148 por que no puedo ver los juegos para ver como vy aprendiendo :( ayudaaa ya se que ya e posteado esto pero es que nadie me ayuda seria bueno un tuto
WO0o0ow!
Instala
El kernel, si tienes custom firmware M33 puedes encontrar el kernel de tu version en la noticia del Custom firmware M33.
Saludos.
Manual del Perfecto Votante Para un voto libre y justo!.
TheGCProjects
me queda claro
me queda claro que a las funciones se les pasa los valores por valor, pero se le pueden pasar por referencia?? porque si se quiere que una funcion devuelva mas de un valor, dime como hacerlo
Pues declara la variable al
Pues declara la variable al comienzo del programa (fuera de la función) y asà podrás acceder a ella desde cualquier punto.
anda se parece bastante al
anda se parece bastante al visual basic!!! por fin voy a intentar leer todos los manuales, voy a tener que esperar una samanita
:)
SÃ, como ya te comenté es un lenguaje sencillo y estos tutos están orientados al programador principiante, por lo que te animo a que le eches un vistazo, más fácil no lo puedes tener, tutorial en español