Anuncios Google

4. Tablas (arrays)

Tutoriales Avanzados Homebrewes

Las tablas en Lua son mucho más que variables. La principal diferencia es que las tablas pueden ser usadas para almacenar múltiples cantidades de datos, no sólo un dato. Puedes pensarlo como un contendedor con muchos cajones dentro para almacenar diferente información. Cualquier juego que hagas en el futuro seguramente usará varias tablas. Usar tablas en Lua es básicamente lo mismo que usar arrays en cualquier otro lenguaje de programación. También aprenderemos algunas otras cosas en este tutorial.

Escribir un sencillo programa que usa tablas.

Vamos a hacer un pequeño programa que va a tener un total de cinco tipos de enemigos y dos jugadores. Para ello vamos a tener que dar al programa información sobre esos personajes. ¿Qué información sobre los jugadores y enemigos supones que necesitamos? Estoy seguro de que has pensado muchas ideas, pero como estás aprendiendo vamos a hacerlo sencillo. Para que nuestros enemigos puedan ser matados tienen que tener salud. Así que lo primero que tenemos que dar al programa es la información para que guarde la salud de los enemigos. También usaremos información para identificar el tipo de enemigo que estamos usando.

Para nuestros jugadores necesitaremos también salud. ¿Qué más podemos usar? ¿Qué tal el tipo de arma que lleva nuestro jugador?

Esto debería ser suficiente para continuar por ahora.

Ahora empezaremos a aprender sobre las tablas. Por favor, sólo añade código a tu programa cuando te lo diga. En este tutorial haré varias referencias a código que no deberías usar en tu archivo.

Las tablas se definen así:

nombretabla = {}

Lo primero es el nombre de la tabla (el que quieras), seguido del signo igual y después las llaves (abrir llave y cerrar llave). Esto crea una tabla vacía sin datos dentro. Para asignar datos a la tabla simplemente añádelos dentro de las llaves, separados por comas. Ej:

miTabla = {12,14,16,18,20}

Ten presente que se usa exactamente igual que una variable. Sólo parece un poco diferente. Ahora, ¿Cómo lo usamos? Bien, cada sección de datos dentro de la tabla está indexada dentro de un elemento de array al que podemos llamar usando el nombre de la tabla seguido de corchetes que contienen el índice. ¿QUEEEE? Miremos:

numeroAfortunado = miTabla[1]

Aquí hemos asignado el valor de la PRIMERA sección de datos de nuestra tabla (la cual es 12) a la variable numeroAfortunado. Vuelve a mirar la tabla que he creado. Dentro de las llaves ¿cuántas secciones de datos tenemos? Si respondiste cinco estás en lo cierto. La primera es 12, la segunda 14, la tercera 16, etc. Podemos referenciar esos datos fácilmente de la forma que he descrito arriba. Los índices empiezan por uno, no como otros lenguajes, los cuales empiezan por cero. Así que aquí tenemos todos los elementos de la tabla que podremos usar:

miTabla[1]
miTabla[2]
miTabla[3]
miTabla[4]
miTabla[5]

Llegados a este punto, creo que deberías intentar escribir tu propio programa usando una tabla. ¿Recuerdas el primer tutorial que hicimos cuando simplemente imprimimos una línea en la pantalla? En vez de variables crea una tabla y usa el comando print para mostrar un elemento de tu tabla. También puedes imprimir varios o todos los elementos con varias sentencias print. Pero recuerda cambiar el valor Y del comando print, porque sino imprimirás los datos unos encima de otros, creando un manchón. No tienes que cambiar el valor X porque ese valor hace referencia a la posición horizontal. El programa automáticamente no mostrará la siguiente línea, tengo que decírtelo. Usa el comando print del mismo modo que lo hiciste con las variables, pero usando nombretabla[índice]. Adelante e inténtalo, yo esperaré aquí, lo juro.

De acuerdo, espero que lo hicieras bien. También me gustaría puntualizar que puedes crear tablas vacías y más tarde asignarlas valores. Ej:

miTabla = { }
miTabla[1] = "manzana"
miTabla[2] = "naranja"
miTabla[3] = "platano"

Fíjate que también puedes usar texto además de números, siempre y cuando lo entrecomilles.

Vamos a complicar más las tablas. Puedes añadir una dimensión extra para referenciar los elementos de tu tabla. Es muy útil para hacer que tu código sea organizado y legible. Veamos un ejemplo. Crearé una tabla vacía y en la siguiente línea mostraré este método.

camiseta = { }
camiseta[1] = { color = "azul", talla = "mediana" }

Básicamente lo que hice fue crear una tabla y en el elemento camiseta[1] creé otra tabla dentro. Digamos que queremos usar esto en un programa para obtener el color y la talla de nuestra camisera. Sería así:

camiseta[1].color
camiseta[1].talla

Si usamos esto en una sentencia print el resultado de camiseta[1].color sería azul y de camiseta[1].talla sería mediana.

Ahora, para nuestro programa. Primero vamos a crear una tabla para almacenar la información de nuestros enemigos. Guardará la salud de los enemigos y el tipo de enemigo. Esta es la primera línea de código (¡por fin!) de nuestro programa, así que ponla en un nuevo archivo script.lua. La primera línea es nuestro viejo y fiel amigo objeto color. Usa otros colores junto al verde si quieres.

verde = Color.new(0, 255, 0)
Enemigo = { }
Enemigo[1] = { tipo = "gargola", salud = 100 }
Enemigo[2] = { tipo = "vampiro", salud = 100 }
Enemigo[3] = { tipo = "hombrelobo", salud = 100 }
Enemigo[4] = { tipo = "fantasma", salud = 100 }
Enemigo[5] = { tipo = "zombie", salud = 100 }

Ya tenemos cinco elementos enemigos creados que dicen que tipo de enemigo es y cual es su salud total en el momento. Para los dos jugadores añade este código a continuación.

Jugador = { }
Jugador[1] = { arma = "espada", salud = 100 }
Jugador[2] = { arma = "cuchillo", salud = 100 }

Ahí tenemos todo lo necesario para nuestro programa de ejemplo. Date cuenta que en un juego real con movimiento, la tabla Jugador sería el sitio perfecto para almacenar la posición del jugador en pantalla y la de los enemigos en la tabla Enemigo. Este ejemplo no moverá ningún personaje, ya llegará ese momento. Lo que vamos a hacer es mostrar la información del jugador y del enemigo en pantalla y quitaremos la salud del enemigo si presionamos el botón X. Sólo vamos a usar un enemigo y un jugador para esto. Pobre jugador 2, no tendrá sitio en el banquillo hasta un posterior tutorial, al igual que los otros enemigos, ya que sólo usaremos al enemigo 1.

A continuación vamos a saltar dentro del bucle del juego. También pongamos el código para nuestro botón, el cual deberías recordar.

while true do
pad = Controls.read()

Ahora, añadamos el comando clear para limpiar la pantalla en cada bucle.

screen:clear()

Ahora vamos a mostrar la salud y el arma de nuestro jugador en pantalla cada bucle.

screen:print(5,10,"Jugador 1 Salud: " .. Jugador[1].salud,verde)
screen:print(5,20,"Jugador 1 Arma: " .. Jugador[1].arma,verde)

En caso de que estés perdido, en nuestra primera sentencia print estamos imprimiendo la coordenada X, la cual es 5 píxeles desde el borde izquierdo de la pantalla, y la coordenada Y, la cual es 10 píxeles desde el borde superior de la pantalla. La pantalla de la PsP tiene 480 píxeles de ancho por 272 píxeles de alto. Luego tenemos el texto "Jugador 1 Salud: ", el cual simplemente muestra eso en pantalla. Después concatenamos el elemento Jugador[1].salud de nuestra tabla a ese texto para que se muestre junto a él. ¿Recuerdas lo que está almacenado en Jugador[1].salud? ¡Deberías! Finalmente, tenemos nuestro color, el cual hemos usado en varias ocasiones anteriormente. La segunda sentencia usa el mismo método pero muestra distinta información sobre nuestro personaje un poco más abajo en la pantalla, bajo la primera línea.

Ahora, al otro lado de la pantalla mostraremos la información de nuestro enemigo. Pon este código.

screen:print(250,10,"Enemigo Salud: " .. Enemigo[1].salud,verde)
screen:print(250,20,"Enemigo Tipo: " .. Enemigo[1].tipo,verde)

A continuación vamos a usar el comando de entrada de botón que aprendimos para detectar si estamos presionando el botón X, y si así es, vamos a restar cinco puntos de salud a nuestro enemigo. Añade esto a tu código.

if pad:cross() then
Enemigo[1].salud = Enemigo[1].salud - 5
end

Esto dice que si presionamos el botón X se restarán cinco puntos del elemento Enemigo[1].salud.

Finalmente, mostramos por pantalla y terminamos nuestro bucle. Añade este código.

screen.waitVblankStart()
screen.flip()
end

Ahora guárdalo y lánzalo para probarlo y luego vuelve aquí.

¡Guau! La salud del enemigo desciende demasiado rápido y puede ponerse negativa. ¡No podemos usarlo así en este juego! Esto te muestra lo rápido que se ejecuta un bucle. Podemos arreglarlo haciendo que la salud sólo descienda cuando presionemos el botón X y no mientras lo mantengamos presionado.

Lo primero es añadir esta línea en la parte alta del código, antes de tus tablas, debajo o encima de tu variable color irá bien.

oldpad = Controls.read()

Ahora la línea if pad:cross() then cámbiala por:

if pad:cross() and oldpad:cross() ~= pad:cross() then

y, por fin, justo después de screen.flip() y antes de end añade esta línea

oldpad = pad

No quiero confundirte con detalles por ahora. Este código se asegura que no estés pulsando el mismo botón que pulsaste la última vez que el bucle se ejecutó, y si lo estuvieras pulsando la sentencia if no se ejecutaría. ~= significa diferente. Aprenderemos los operadores pronto. Guarda el código, lánzalo y pruébalo.

Todo funciona bien excepto lo de la salud negativa. Vamos a aprender otro operador ahora.

Cambia la línea if pad:cross() and oldpad:cross() ~= pad:cross() then por

if pad:cross() and oldpad:cross() ~= pad:cross() and Enemigo[1].salud > 0 then

Hemos añadido Enemigo[1].salud > 0. ">" significa mayor que, lo cual deberías saber. Lo que la línea completa dice es que si el botón X está presionado Y no estamos manteniendo presionado el mismo botón que en el bucle anterior, Y la salud del enemigo es mayor que cero, entonces (decrementa la salud en 5). Fíjate que TODAS esas condiciones tienen que ser verdad para que siga adelante. Guarda el código y lánzalo y todo debería funcionar bien. La salud del enemigo no puede ir por debajo de cero.

Bien, esto es todo por este tutorial. Entiende que el principal propósito de este tutorial eran las tablas. Por lo que si no has cogido completamente los demás conceptos, está bien. Nos vemos en el próximo tutorial.

4.764705
Tu voto: Ninguno Votos totales: 4.8 (17 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.

no me funciona

he segido tus otros tutoriales y los he completado sin ningun fallo, pero el tutorial de tablas no me funciona, al principio pensaba q avia escrito algo mal asi que copie tus codigos completamente i comprobe no equivocarme y cuando lo ejecuto no aparece nada, y pone que se ha finalizado sin ningun error.

nose que hacer, si te sirve uso el programa mirolua

 

Imagen de Dioni0396

Tienes que usar

lua player 0.20

Imagen de luisadniel

no, eso es muy viejo, usa el

no, eso es muy viejo, usa el tutorial de chimecho XD

Imagen de PhAnThOm

puede que sea viejo, pero

puede que sea viejo, pero sirve mucho para opciones como en un rpg... yo me guie por ese en mis dias, XD!

sl2

Imagen de NauTiluS1

INCREIBLE!!

Wow increible me se todos los codigos desde el paso 1 hasta el 4 EXCELENTE TUTORIAL ahora me ire al 5, una pregunta, despues que acabe este a donde me voy?


Follow me twitter nautilus1_jmccu!!
Sony, ya a nadie le interesa tus UMD si alguien compra una psp es por nosotros los coders. Madura y has un FW que haga la diferencia y anime a las personas en comprar un PSP

Imagen de luisadniel

no que no sabias LUA HM?

no que no sabias LUA HM?

Imagen de tonivans

EXELENTE TUTO

muy buen tuto aqui esta mi codigo:

verde = Color.new(13,123,30)

oldpad = Controls.read()

Enemigo = {1,2,3,4,5}
Enemigo[1] = { tipo = "Kopa", salud = 50 }
Enemigo[2] = { tipo = "bobino", salud = 100 }
Enemigo[3] = { tipo = "soldado Orco", salud = 200 }
Enemigo[4] = { tipo = "hipie", salud = 300 }
Enemigo[5] = { tipo = "Ganondorf", salud = 500 }

Jugador = {1,2}
Jugador[1] = { arma = "MP40", salud = 100 }
Jugador[2] = { arma = "Subfucil", salud = 100 }

while true do
pad = Controls.read()
screen:clear()

screen:print(5,10,"Jugador 1 Salud: " .. Jugador[1].salud,verde)
screen:print(5,20,"Jugador 1 Arma: " .. Jugador[1].arma,verde)
screen:print(250,10,"Enemigo Salud: " .. Enemigo[1].salud,verde)
screen:print(250,20,"Enemigo Tipo: " .. Enemigo[1].tipo,verde)

if pad:cross() and oldpad:cross() ~= pad:cross() and Enemigo[1].salud > 0 then
Enemigo[1].salud = Enemigo[1].salud - 10
end

screen.waitVblankStart()
screen.flip()
oldpad = pad
end


Solo quien ha comido ajo puede darnos una palabra de aliento XD XD XD

Imagen de NightKnight

Gracias por este tuto aora

Gracias por este tuto aora por el 5

no se q pasa

EDITO-ya lo resolvi

verde = Color.new(0, 255, 0)
oldpad = Controls.read()

Enemigo = {}
Enemigo[1] = { tipo = "hombrelobo", arma = "espada", salud = 100}

Jugador = {}
Jugador[1] = { tipo = "humano", arma = "espada", salud = 100}

while true do
pad = Controls.read()
screen:clear()
--Jugador
screen:print(5,10, "Jugador 1 salud: " .. Jugador[1].salud,verde)
screen:print(5,20, "Jugador 1 tipo: ".. Jugador[1].tipo,verde)
screen:print(5,30, "Jugador 1 arma: ".. Jugador[1].arma,verde)
--Enemigo
screen:print(250,10, "Enemigo 1 salud: ".. Enemigo[1].salud,verde)
screen:print(250,20, "Enemigo 1 tipo: ".. Enemigo[1].tipo,verde)
screen:print(250,30, "Enemigo 1 arma: ".. Enemigo[1].arma,verde)

if pad:cross() and oldpad:cross() ~= pad:cross() and Enemigo[1].salud > 0 then
Enemigo[1].salud = Enemigo[1].salud - 5
end
if pad:triangle() and oldpad:triangle() ~= pad:triangle() and Jugador[1].salud > 0 then
Jugador[1].salud = Jugador[1].salud - 5
end

screen.waitVblankStart()
screen.flip()
oldpad = pad
end 

EDITO-ya lo resolvi.

Imagen de yoan03

yo lo puse

asi y me salio bien :

 morado = Color.new(255,0,255)
amarillo = Color.new(255,255,0)
oldpad = Controls.read()

enemigo = {}
enemigo[1] = { tipo = "gargola", salud = 100}
enemigo[2] = { tipo = "vampiro", salud = 100}
enemigo[3] = { tipo = "hombrelobo", salud = 100}
enemigo[4] = { tipo = "fantasma", salud = 100}
enemigo[5] = { tipo = "zombi", salud = 100}

jugador = {}
jugador[1] = { arma = "espada", salud = 100}
jugador[2] = { arma = "cuchillo", salud = 100}

while true do

pad = Controls.read()
screen:clear()
--jugador
screen:print(5,10,"jugador 1 Salud:"..jugador[1].salud,morado)
screen:print(5,20,"jugador 1 Arma:"..jugador[1].arma,morado)
--enemigo
screen:print(250,10,"enemigo 1 Tipo:"..enemigo[1].tipo,amarillo)
screen:print(250,20,"enemigo 1 Salud:"..enemigo[1].salud,amarillo)
if jugador[1].salud > 0 then
if pad:cross() and oldpad:cross() ~= pad:cross() and enemigo[1].salud > 0 then
enemigo[1].salud = enemigo[1].salud - 2
end
end
if enemigo[1].salud > 0 then
if pad:circle() and oldpad:circle() ~= pad:circle() and jugador[1].salud > 0 then
jugador[1].salud = jugador[1].salud - 5
end
end
screen.waitVblankStart()
screen.flip()
oldpad = pad
end

keria ponerlo de una forma k si uno de los dos llegan a cero la salud no pueda bajar  pense k me iba a dar errores pero no me dio ni uno por hacerlo yo mismo con mis ideas un salu2 para todos los peseperos y gracia por los tutos le toy sacando provecho.

Imagen de CkFra

El inconveniente

que hay en eso es que si la salud fuese un número impar, cuando llegase al 1, restaría 2 y se quedaría en -1.

Para evitar algo parecido se podría usar lo siguiente:

if enemigo[x].salud < 0 then enemigo[x].salud = 0 end

Así, siempre que la salud sea un número negativo se convierta en 0 automáticamente.

Saludos 

Imagen de CkFra

Duda...

Se pueden crear varios bucles a la vez?

O con poner while true do al principio ya nos vale?

y qué sería lo mejor?

Saludos

Imagen de Pana

¿? Esto... Para que quieres

¿? Esto... Para que quieres varios bucles???

De todas formas, si se puede hacer, yo lo hago llamando a otro script desde el principal, al crear otro bucle, puedo cargar imagenes fuera de cualquier bucle (puesto que al entrar en el nuevo, sale del anterior :P).

Saludos. 

Imagen de Pana

Pues veréis, estoy

Pues veréis, estoy siguiendo el tutorial, pero antes de ceñirme exactamente al tutorial intento hacerlo por mi mismo. Hos dejo el fragmento del codigo para que me entedáis La cosa es que como veréis, para quitarle puntos de salud a los enemigos lo he hecho de una forma distinta. Estoy minimanente familiarzado con lenguaje Java, así que utilicé un contador (como hago en java). El problema es que al hacerlo de esta forma y tener la variable de salud dentro de la tabla eneigmo, no la podía poner vacía "salud = nil" ya que me saltaba un error... así que me vi obligado a sacarla fuera... Porque pasa esto? no se pueden introducir variables vacías dentro de las tablas??? 

enemigo = {}
enemigo[1] = {tipo = "Zerg", unidad = "Zergling", arma = "Doble Garra"}
enemigo[2] = {tipo = "Zerg", unidad = "Zergling", arma = "Doble Garra"}

salud = nil
salud2 = nil
saludInicial = 20
dannos = 5
i = 0
j = 0

--********Funciones.********
--Bucle Principal
salud = saludInicial
salud2 = saludInicial
while true do
      screen:clear()
      pad = Controls.read()

      if pad:cross() and oldpad:cross() ~= pad:cross() and salud > 0 then
         salud = saludInicial - dannos - i
         i = i + 5
      end
      if pad:circle() and oldpad:circle() ~= pad:circle() and salud2 > 0 then
         salud2 = saludInicial - dannos - j
         j = j + 5
      end

       [...]

--***enemigo1***
      screen:print(325,10,"Raza: "..enemigo[1].tipo,azul)
      screen:print(325,20,"Unidad: "..enemigo[1].unidad,amarillo)
      screen:print(325,30,"Salud: "..salud,rojo)
      screen:print(325,40,"Arma: "..enemigo[1].arma,blanco)
 

Saludos.

Image Hosted by ImageShack.us

Imagen de pucelano

Prueba con esto: azul =

Prueba con esto:

azul = Color.new(0,0,255)
enemigo = {}
enemigo[1] = {tipo = "Zerg", unidad = "Zergling", arma = "Doble Garra", salud =0}
enemigo[2] = {tipo = "Zerg", unidad = "Zergling", arma = "Doble Garra", salud =0}

saludInicial = 20
dannos = 5
i = 0
j = 0

--********Funciones.********
--Bucle Principal
enemigo[1].salud = saludInicial
enemigo[2].salud = saludInicial

while true do
      screen:clear()
      pad = Controls.read()
if pad ~= oldPad then
      if pad:cross()  and enemigo[1].salud > 0 then
         enemigo[1].salud = saludInicial - dannos - i
         i = i + 5
      end
      if pad:circle() and enemigo[2].salud > 0 then
         enemigo[2].salud = saludInicial - dannos - j
         j = j + 5
      end

    oldPad = pad
end

--***enemigo1***
      screen:print(325,10,"Raza: "..enemigo[1].tipo,azul)
      screen:print(325,20,"Unidad: "..enemigo[1].unidad,azul)
      screen:print(325,30,"Salud: "..enemigo[1].salud,azul)
      screen:print(325,40,"Arma: "..enemigo[1].arma,azul)
     
      screen:print(325,110,"Raza: "..enemigo[2].tipo,azul)
      screen:print(325,120,"Unidad: "..enemigo[2].unidad,azul)
      screen:print(325,130,"Salud: "..enemigo[2].salud,azul)
      screen:print(325,140,"Arma: "..enemigo[2].arma,azul)
     
          screen.waitVblankStart()
    screen.flip()

end

 

Espero que sea lo que buscas


 

Descargar Homebrew de BETA, gratis. Visualizar un tutorial, gratis. Iniciarse en la programacion en español, gratis. Colaborar a que la scene PSP en español crezca, no tiene precio.


Descargar Homebrew de BETA, gratis. Visualizar un tutorial, gratis. Iniciarse en la programacion en español, gratis. Colaborar a que la scene PSP en español crezca, no tiene precio.

Imagen de Pana

ya lo tengo, gracias puce,

ya lo tengo, gracias puce, no se me había ocurrido poner valor 0 a la variable salud :P, estaba empeñao con ponerle un nil. Entonces dentro de una tabla no se puede poner una variable vacía no? 

Saludos.

Image Hosted by ImageShack.us

Imagen de pucelano

En una tabla puedes dejar

En una tabla puedes dejar sin definir una variable, y definirla cuando la vayas a necesitar. Lo mejor es que tu mismo hagas pruebas.

Un saludo


 

Descargar Homebrew de BETA, gratis. Visualizar un tutorial, gratis. Iniciarse en la programacion en español, gratis. Colaborar a que la scene PSP en español crezca, no tiene precio.


Descargar Homebrew de BETA, gratis. Visualizar un tutorial, gratis. Iniciarse en la programacion en español, gratis. Colaborar a que la scene PSP en español crezca, no tiene precio.

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.