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
Comentarios
Una pregunta
Que significa sel = sel + 1.
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:
También se me encimó el texto de la vida del jugador y enemigo pero bastó con moverlo un poco más hacia abajo:
Rodrigo [Roy]
Computación, Facultad de Ciencias, UNAM (México)
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
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
Cierto,
Muy observador, ahi se demuestra quien aprende de verdad. +1
Creo que
creo que se dice concatenación no concatetación...
Salu2