Anuncios Google

Lua: Controles e Imagenes.

Tutoriales avanzados de Homebrewes

Hola de nuevo, en esta entrega vamos a enseñar algo mas especial, vamos a empezar a crear nuestro primer juego, aunque muy básico, aprenderemos a usar los controles y las imágenes de forma que de un resultado exquisito. Vamos a aprender a resumir mucho nuestro código. En esta entrega aprenderemos hasta incluso a crear un menú. Esta entrega es mas entretenida, seguro que os gustara.

Lo primero sera aprenderse los controles aquí os dejo un listado;

Estos valores de controles son booleanos.
 
[KEY] puede tomar los siguientes valores: A, B, X, Y, L, R, Start, Select, Up, Down, Left, Right
 
Keys.held.[KEY]:  ¿Esta el boton pulsado? Quiere marcar si ese boton esta pulsado, en caso de que lo este devolvera true. Un ejemplo: Keys.held.A
 
Keys.released.[KEY]: ¿Esta el boton soltado? Quiere marcar si ese boton esta soltado, en caso de que no lo este devolvera false. Un ejemplo: Keys.released.A
 
Keys.newPress.[KEY]: ¿Acaba de pulsar el boton? Quiere marcar si ese boton acaba de ser pulsado, en caso de que lo este devolvera true. Un ejemplo: Keys.newPress.A

Bien, una vez sabido todos los controles nos disponemos a avanzar, crearemos un juego que cuando la salud del enemigo disminuya este muera. Vamos a hacer un menú con 2 opciones, Jugar y salida, por supuesto tu puedes avanzar en este código. Descargate la imagen que usaremos de fondo.

Bien, lo primero que haremos sera cargar nuestra imagen y tenemos 2 memorias a elegir donde cargarlo, yo recomiendo la RAM en vez de la VRAM.

Fondo = Image.load("Destellos.png", RAM)

Bien, como vemos Cargamos una imagen usando Image.load, su uso es sencillo y su función también; la función  es que cargue una imagen en la memoria y su uso; También es sencillo, Image.load recibe 2 argumentos, el primero la ruta donde esta la imagen, y después la memoria a cargar. Recomendamos SIEMPRE usar imágenes que estén al lado del script principal o en alguna subcarpeta. Por ejemplo si tuviéramos al lado del script una carpeta llamada imágenes y dentro la imagen se llamaría asi en la función; "imagenes/Destellos.png". Tenéis que saber que la resolución de la nintendo DS es de 256 x 192; bueno basta ya de tanta palabrería y continuamos.

Vamos a crear unos colores;

Rojo = Color.new(31,0,0)
Azul = Color.new(0,0,31)
Verde = Color.new(0,31,0)
Blanco = Color.new(31,31,31)
Negro = Color.new(0,0,0)

Ahora una tabla donde tendremos las opciones del menú;

Opciones = { }
Opciones[1] = "Iniciar Juego"
Opciones[2] = "Salir"

¿Lo tenemos todo? Las imágenes, los colores, las opciones... OMG Falta la vida tuya y la del enemigo y unas variables!

Vida = { }
Vida.enemigo = 100
Vida.jugador = 100
IniciarJuego = false
Sel = 1

Y una función;

function Mov()
if Keys.newPress.Down then
Sel = Sel + 1
elseif Keys.newPress.Up then
Sel = Sel - 1
end
end

Ahora si, bucle infinito;

while true do
Controls.read() --ESENCIAL USAR ESTO, sin el controls.read() nunca nos funcionara los controles!
screen.blit(SCREEN_DOWN,0,0,Fondo)
if IniciarJuego == false then --Esto sera para que mas adelante cuando sea true, no se cumpla lo que haya dentro.
Mov() --Mi funcion.

screen.blit bliteara nuestra imagen cargada previamente, recibe 4 argumentos,la pantalla, la posición X, la Y, y la imagen cargada anteriormente. ¿Es facil verdad?

Controls.read() Realiza la lectura de botones, Se recomienda ENCARECIDAMENTE usarlo siempre al principio del while true do.

Hum, que vendría ahora... El menú;

for i=1,#Opciones do --#Opciones llama o te da el numero de subtablas que tiene la tabla principal.
if Sel == i then
screen.print(SCREEN_DOWN,10,(10 * i) + 5,Opciones[i],Rojo) --Donde os podeis liar es en el argumento y, lo que hace es que a cada pasada se i aumente en 1
else
screen.print(SCREEN_DOWN,10,(10 * i) + 5,Opciones[i],Azul)
end
end

Tendríamos el menú, ¿pero que nos falta? Por si no lo has adivinado, nos falta que al pulsar A vaya a una condición.

if Sel == 1 and Keys.newPress.A then
IniciarJuego = true
elseif Sel == 2 and Keys.newPress.A then
os.exit()
end
end--Cerramos el if que antes creamos.

Bien, ahora IniciarJuego = true, que hacemos? Simple, crear nuestro enemigo con su vida.

if IniciarJuego == true then
screen.print(SCREEN_DOWN,10,10,"Mi Vida: "..Vida.jugador) --a los .. se les llama concatetacion (Un nombre rarillo xD) sirve para unir valores entre strings y numbers.
screen.print(SCREEN_DOWN,150,10,"Vida enemigo: "..Vida.enemigo)
--Vamos a hacer que cuando la vida del enemigo llegue a 0 ponga "has matado al rival"
if Keys.held.A and Vida.enemigo > 1 then --Queremos held ya que queremos que se cumpla mientras esta pulsado y vida enemigo sea mayor a 1
Vida.enemigo = Vida.enemigo - 1 --Esto reducira su vida.
end
if Vida.enemigo == 0 then
screen.print(SCREEN_DOWN,10,100,"Lo mataste Pulsa B.") --Si, quiero que cuando lo mate y pulse B el programa termine.
if Keys.newPress.B then
os.exit()
end
end
end

Bien, ya tenemos el juego, pero le falta el render() y el end. Render() siempre sera necesario; Viste que fácil es realizar un menú, ademas viste la forma de crear, es muy util, ir argumentando que queremos en cada apartado; os dejo el codigo final;

Fondo = Image.load("Destellos.png", RAM)
Rojo = Color.new(31,0,0)
Azul = Color.new(0,0,31)
Verde = Color.new(0,31,0)
Blanco = Color.new(31,31,31)
Negro = Color.new(0,0,0)
Opciones = { }
Opciones[1] = "Iniciar Juego"
Opciones[2] = "Salir"
Vida = { }
Vida.enemigo = 100
Vida.jugador = 100
IniciarJuego = false
Sel = 1
function Mov()
if Keys.newPress.Down then
Sel = Sel + 1
elseif Keys.newPress.Up then
Sel = Sel - 1
end
end
while true do
Controls.read() --ESENCIAL USAR ESTO, sin el controls.read() nunca nos funcionara los controles!
screen.blit(SCREEN_DOWN,0,0,Fondo)
if IniciarJuego == false then --Esto sera para que mas adelante cuando sea true, no se cumpla lo que haya dentro.
Mov() --Mi funcion.
for i=1,#Opciones do --#Opciones llama o te da el numero de subtablas que tiene la tabla principal.
if Sel == i then
screen.print(SCREEN_DOWN,10,(10 * i) + 5,Opciones[i],Rojo) --Donde os podeis liar es en el argumento y, lo que hace es que a cada pasada se i aumente en 1
else
screen.print(SCREEN_DOWN,10,(10 * i) + 5,Opciones[i],Azul)
end
end
if Sel == 1 and Keys.newPress.A then
IniciarJuego = true
elseif Sel == 2 and Keys.newPress.A then
os.exit()
end
end--Cerramos el if que antes creamos.
if IniciarJuego == true then
screen.print(SCREEN_DOWN,10,10,"Mi Vida: "..Vida.jugador) --a los .. se les llama concatetacion (Un nombre rarillo xD) sirve para unir valores entre strings y numbers.
screen.print(SCREEN_DOWN,150,10,"Vida enemigo: "..Vida.enemigo)
--Vamos a hacer que cuando la vida del enemigo llegue a 0 ponga "has matado al rival"
if Keys.held.A and Vida.enemigo > 1 then --Queremos held ya que queremos que se cumpla mientras esta pulsado y vida enemigo sea mayor a 1
Vida.enemigo = Vida.enemigo - 1 --Esto reducira su vida.
end
if Vida.enemigo == 0 then
screen.print(SCREEN_DOWN,10,100,"Lo mataste Pulsa B") --Si, quiero que cuando lo mate y pulse B el programa termine.
if Keys.newPress.B then
os.exit()
end
end
end
render()
end

3.96
Tu voto: Ninguno Votos totales: 4 (25 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 los2345

Una pregunta

Que significa sel = sel + 1.

Imagen de AnimeRoy

Un par de detalles

Gracias por el tutorial, está simple y me ha ayudado bastante.

Solo queria mencionar que en la función Mov() si presionas varias veces arriba o abajo la variable Sel puede aumentar o disminuir tanto como queramos, en lugar de que solo sea entre los valore 1 y 2. En mi código lo corregí agregando una condición más:

function Move()
	if Keys.newPress.Down and seleccion == 1 then
		seleccion = seleccion + 1
	elseif Keys.newPress.Up and seleccion == 2 then
		seleccion = seleccion - 1
	end
end

También se me encimó el texto de la vida del jugador y enemigo pero bastó con moverlo un poco más hacia abajo:

screen.print(SCREEN_DOWN, 10, 50, "Mi vida: " .. vida.jugador)
screen.print(SCREEN_DOWN, 150, 50, "Vida enemigo: " .. vida.enemigo)

 


Rodrigo [Roy]

Computación, Facultad de Ciencias, UNAM (México)

Imagen de renegreg

Dudaaas

Mira me quede con la duda de para que sirve el codigo sel que ponias :S no entendi bien su uso, y tambien me gustaria saber como cargar la imagen de jugador y del enemigo y agregar otro tipo de cosas :D no se si me pudieras mandar un mensaje cuando veas esto para que me puedas explicar esque si me gustaria crear mi propio juego :P jejejeje


C:::|====> °-° <====|:::]   XD       

dudas y preguntas por MP :D

Imagen de Me3Merlos

Error

Hola Dioni, he estado leyendo tus tutoriales y he visto un error que impedia que el contador de la vida enemiga llegara a 0

if Keys.held.A and Vida.enemigo > 1 then --Queremos held ya que queremos que se cumpla mientras esta pulsado y vida enemigo sea mayor a 1

Vida.enemigo = Vida.enemigo - 1 --Esto reducira su vida.

end

Se trata de canviar el "1 then" por un "0 then"

if Keys.held.A and Vida.enemigo > 0 then --Queremos held ya que queremos que se cumpla mientras esta pulsado y vida enemigo sea mayor a 1

Vida.enemigo = Vida.enemigo - 1 --Esto reducira su vida.

end

Imagen de Dioni0396

Cierto,

Muy observador, ahi se demuestra quien aprende de verdad. +1

Creo que

creo que se dice concatenación no concatetación...

 

Salu2

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.