Hacer que un personaje salte puede ser una de las cosas mas dificiles de aprender, pero sera lo que aprenderemos aqui 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 codigo crea varios objetos color que usaremos posteriormente.
--Creamos los Colores. verde=Color.new(0,255,0) blanco = Color.new(255,255,255)
La siguiente seccion de codigo creara imagenes vacias y las rellenara de color verde y blanco. Una imagen sera nuestro personaje y la otra el suelo. Los numeros entre paréntesis son el tamaño de la imagen en pixeles (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 codigo 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 almacenara la gravedad de nuestro personaje. personaje.x es la posicion horizontal de nuestro personaje en pantalla. personaje.y es la posicion vertical de nuestro personaje en pantalla. personaje.velocidadSalto sera la velocidad a la que nuestro personaje salta. personaje.estadoSalto nos dice en qué estado esta el personaje en ese momento: suelo, saltando o cayendo.
Lo siguiente sera empezar nuestro bucle principal y pondremos codigo para mover nuestro personaje tanto a izquierda como a derecha. Si presionamos izquierda, a la posicion "x" del personaje se le restara 2 y si presionamos derecha sera 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 lineas de codigo:
if pad:cross() and personaje.estadoSalto == "suelo" then personaje.estadoSalto = "saltando" end
Esto simplemente dice que si presionamos el boton 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 hara que la velocidad sea un poquito mas lenta a cada pasada del bucle, asi nuestro personaje se subira mas lento cuanto mas lejos esté del suelo, dando realismo al salto. La ultima linea resta la velocidad del salto de la gravedad del personaje.
Veamos la siguiente parte:
if personaje.velocidadSalto < 0 then personaje.estadoSalto = "cayendo" end
Este codigo dice que si la velocidad del salto de nuestro personaje es menor que cero entonces nuestro personaje habra alcanzado la plenitud del salto, cambiando el estado del personaje a cayendo y no estara mucho mas 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 esta cayendo, entonces incrementamos la gravedad en velocidadSalto, lo que provocara la caida.
Siguiente parte:
if personaje.gravedad == 230 then personaje.velocidadSalto = 10 personaje.estadoSalto = "suelo" end if personaje.gravedad > 230 then personaje.gravedad = 230 end
Este codigo dice que si nuestra gravedad esta 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 ultima linea 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 posicion vertical de nuestro personaje a la gravedad. Cada bucle la "y" del personaje sera 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 posicion "x" e "y" del personaje en pantalla ademas 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 numeros si quieres ver como afectan al salto.
Comentarios
Como puedo saltar obstáculos?
Ya entendí tu código, pero como puedo hacer para que el personaje salte sobre obstáculos y pueda realizar nuevos saltos sobre estos
mi código está así:
error inesperado
codigo fuente :
Pues tengo un error y lo ice tal como dices y me sale el siguiente eror estoy usando Lua PLayer en Windows no tiene que ver no . soy novato en esto .
Image.createEmpEty - Image.createEmpty
--Ahora el suelo--
suelo = Image.createEmpety(480,10)
es asi:
suelo = Image.createEmpty(480,10)
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
me pasa lo mismo
pero nadie respondeee!!...
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