![]()
Hacer que un personaje salte puede ser una de las cosas más difÃciles de aprender, pero será lo que aprenderemos aquà ahora. Crearemos un suelo y un sencillo personaje capaz de moverse hacia la izquierda y derecha y de saltar. Conseguiremos que el efecto del salto sea muy real. Empecemos.
Nuestra primera parte de código crea varios objetos color que usaremos posteriormente.
--Creamos los Colores.
verde=Color.new(0,255,0)
blanco = Color.new(255,255,255)
La siguiente sección de código creará imágenes vacÃas y las rellenará de color verde y blanco. Una imagen será nuestro personaje y la otra el suelo. Los números entre paréntesis son el tamaño de la imagen en pÃxeles (anchura y altura).
--Creamos el suelo.
suelo = Image.createEmpty(480,10)
suelo:clear(verde)
--Creamos el personaje.
personaje1 = Image.createEmpty(32,32)
personaje1:clear(blanco)
Ahora haremos un array para nuestro personaje que contenga varios tipos. Mira el código y ahora lo explicaré.
--Array del personaje.
personaje = {}
personaje.gravedad = 230
personaje.y = 230
personaje.x = 50
personaje.velocidadSalto = 10
personaje.estadoSalto = "suelo"
personaje.gravedad almacenará la gravedad de nuestro personaje.
personaje.x es la posición horizontal de nuestro personaje en pantalla.
personaje.y es la posición vertical de nuestro personaje en pantalla.
personaje.velocidadSalto será la velocidad a la que nuestro personaje salta.
personaje.estadoSalto nos dice en qué estado está el personaje en ese momento: suelo, saltando o cayendo.
Lo siguiente será empezar nuestro bucle principal y pondremos código para mover nuestro personaje tanto a izquierda como a derecha. Si presionamos izquierda, a la posición "x" del personaje se le restará 2 y si presionamos derecha será incrementado en 2.
--Bucle principal
while true do
pad = Controls.read()
screen:clear()
if pad:left() then
personaje.x = personaje.x - 2
end
if pad:right() then
personaje.x = personaje.x + 2
end
Ahora llegamos a la parte interesante. Mira las siguientes lÃneas de código:
if pad:cross() and personaje.estadoSalto == "suelo" then
personaje.estadoSalto = "saltando"
end
Esto simplemente dice que si presionamos el botón X y estamos en el suelo, se cambia el estado a saltando.
Ahora la siguiente parte:
if personaje.estadoSalto == "saltando" then
personaje.velocidadSalto = personaje.velocidadSalto - 0.5
personaje.gravedad = personaje.gravedad - personaje.velocidadSalto
end
Esto dice que si estamos en el estado saltando entonces restamos 0.5 de nuestra velocidad de salto, lo que hará que la velocidad sea un poquito más lenta a cada pasada del bucle, asà nuestro personaje se subirá más lento cuanto más lejos esté del suelo, dando realismo al salto. La última lÃnea resta la velocidad del salto de la gravedad del personaje.
Veamos la siguiente parte:
if personaje.velocidadSalto < 0 then
personaje.estadoSalto = "cayendo"
end
Este código dice que si la velocidad del salto de nuestro personaje es menor que cero entonces nuestro personaje habrá alcanzado la plenitud del salto, cambiando el estado del personaje a cayendo y no estará mucho más tiempo en el aire.
Siguiente parte:
if personaje.gravedad < 230 and personaje.estadoSalto == "cayendo" then
personaje.velocidadSalto = personaje.velocidadSalto + 0.5
personaje.gravedad = personaje.gravedad + personaje.velocidadSalto
end
Esto dice que si nuestra gravedad es inferior a 230 y nuestro personaje está cayendo, entonces incrementamos la gravedad en velocidadSalto, lo que provocará la caÃda.
Siguiente parte:
if personaje.gravedad == 230 then
personaje.velocidadSalto = 10
personaje.estadoSalto = "suelo"
end
if personaje.gravedad > 230 then personaje.gravedad = 230 end
Este código dice que si nuestra gravedad está en 230 (el nivel del suelo) entonces igualamos la velocidad de salto de nuevo a 10 y cambiamos el estado del personaje a suelo. La última lÃnea dice que si nuestra gravedad supera los 230, entonces la volvemos a igualar a 230. Ese es el nivel del suelo, por lo que no podemos atravesarlo.
Ahora necesitaremos fijar la posición vertical de nuestro personaje a la gravedad. Cada bucle la "y" del personaje será la gravedad:
personaje.y = personaje.gravedad
Acabemos nuestro programa con algunas cosas sencillas. Primero mostraremos nuestro personaje y el suelo en pantalla. Luego mostraremos la posición "x" e "y" del personaje en pantalla además del estadoSalto del personaje. Al final acabaremos como siempre.
screen:blit(personaje.x,personaje.y,personaje1)
screen:blit(0,262,suelo)
screen:print(10,10,"X: "..personaje.x.." Y: "..personaje.y,verde)
screen:print(10,20,"estadoSalto: "..personaje.estadoSalto,verde)
screen.waitVblankStart()
screen.flip()
end
Pruébalo. Izquierda y derecha para moverse y X para saltar. Juega con los números si quieres ver como afectan al salto.
Comentarios
Problema
Tengo un problema, pues el cuadrito que salta se sale del rango de la pantalla, como puedo modificar el codigo para que no haga eso.
Gracias por el excelente tuto
Problema con un proyecto!
Hola, soy bastante novato en el tema del LUA. acabo de empezar y queria intentar cambiar el cuadradito blanco por una imagen. intente por asi decirlo " mezclar" este tutorial con el otro de como colocar imagenes de Elender(creo) pero no lo puedo cargar. si sirve de algo adjunto aqui el texto como lo he escrito y si alguien me pudiese ayudar a entender el error se lo agradeceria enormemente!!
verde = Color.new(0,255,0)
--Creamos a Gotenks
gotenks = Image.load("gotenks.png")
anchoPantalla = 480 - gotenks:withd()
altoPantalla = 272 - gotenks:withd()
--Creamos el suelo
suelo = Image.createEmpty(480,10)
suelo:clear(verde)
--Array del personaje.
gotenks = {}
gotenks.gravedad = 230
gotenks.y = 230
gotenks.x = 50
gotenks.velocidadSalto = 10
gotenks.estadoSalto = "suelo"
--Bucle principal
while true do
pad = Controls.read()
screen:clear()
if pad:left() then
gotenks.x = gotenks.x - 2
end
if pad:right() then
gotenks.x = gotenks.x + 2
end
if pad:cross() and gotenks.estadoSalto == "suelo" then
gotenks.estadoSalto = "saltando"
end
if gotenks.estadoSalto == "saltando" then
gotenks.velocidadSalto = gotenks.velocidadSalto - 0.5
gotenks.gravedad= gotenks.gravedad - personaje.velocidadSalto
end
if gotenks.velocidadSalto < 0 then
gotenks.estadoSalto = "cayendo"
end
if gotenks.gravedad < 230 and personaje.estadoSalto == "cayendo" then
gotenks.gravedad = gotenks.velocidadSalto + 0.5
gotenks.gravedad = gotenks.gravedad + gotenks.velocidadSalto
end
if gotenks.gravedad == 230 then
gotenks.velocidadSalto = 10
gotenks.estadoSalto = "suelo"
end
if gotenks.gravedad > 230 then gotenks.gravedad = 230 end
gotenks.y = gotenks.gravedad
screen:blit(gotenks.x,gotenks.y,gotenks)
screen:blit(0,262,suelo)
screen:print(10,10,"X: "..gotenks.x.." Y: "..gotenks.y,verde)
screen:print(10,20,"estadoSalto: "..gotenks.estadoSalto,verde)
screen.waitVblankStart()
screen.flip()
end
GRACIAS!!
(si sirve de algo al activarlo en la psp me pone, que: ERROR: SCRIPT.LUA:4: loop in gettable)
Psp Evolution: 2.00 -> 2.60 -> 1.50 ( me la roban:( ) xDxDxD
Psp Evolution2 : 2.01 -> 2.60 -> 1.50(DeviceHook) -> 3.40OE -> 3.51OE -> 3.52 m33-2 :D
tiene un pequeño fallo el
tiene un pequeño fallo el codigo y es que nunca lle ¡ga al estado cayendo, lo pone en estado salto, no parece muy importante pero cuando quieres ponerle imagenes si que lo es. Le he puesto una cuando salta, otra cuando cae y otra cuando esta en el suelo, pero saltando y cayendo es la misma
La verdad es que me habÃa
La verdad es que me habÃa dado cuenta de que nunca se alcanzaba ese etado, pero no puse nada porque en principio esto es una traducción del original. Tampoco he dicho nada de las tabulaciones en los tutoriales, porque el autor nunca ha hablado de ello, pero para mà es algo fundamental que él no utiliza. En fin, voy a probar lo que me dices y si va todo bien lo cambio. Gracias N2eiDer.
Por fin he tenido tiempo de
Por fin he tenido tiempo de revisar el código y ya he solucionado el problema del estado "cayendo", hay que hacer dos modificaciones (ya estamos corrigiendo al gran Charlie, supongo que vamos por buen camino... jejeje). Subo el script.lua actualizado y los cambios los subrayo en la web, para que se vea lo que he modificado. Saludos.
añado si cambias la linea
añado si cambias la linea 38 por
personaje.velocidadSalto = personaje.velocidadSalto - 0.5
entoneces si llega al estado cayendo
ya lo he conseguido
ya lo he conseguido arreglar, pero hay alguna forma de hacer un doble salto? es decir si mientras estas en el aire pulsas de nuevo x saltes mas