Anuncios Google

7. Funciones

Tutoriales Avanzados Homebrewes

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.

Usando funciones

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.

4.605265
Tu voto: Ninguno Votos totales: 4.6 (38 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.
Imagen de NightKnight

ok ya pase el 7 pero no los

ok ya pase el 7 pero no los estoy probando

Imagen de RuGuEr

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

 

Imagen de Guillermo_Cornielle

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)

 

Imagen de Guillermo_Cornielle

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!

Imagen de Guillermo_Cornielle

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

Imagen de jjdrako

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


Imagen de ELeNDeR

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

Imagen de ELeNDeR

:)

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

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.