Anuncios Google

02. Salto muy real.

Tutoriales Avanzados Homebrewes

Hacer que un personaje salte puede ser una de las cosas mas difi­ciles 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 vaci­as 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 pi­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 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 li­neas 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 li­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 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 cai­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 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 li­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 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.

5
Tu voto: Ninguno Votos totales: 5 (9 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.

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í:

ace = Image.load("/Stand_Ace_Der_1.png") --sprtite 
dofile("/colores.lua") -- vectores con colores
 
 
 suelo = Image.createEmpty(480,10)
suelo:clear(color.verde)
 
--personaje--
personaje1 = ace
 
 -- obstaculos cajas
 cajas = Image.createEmpty(20,20)
 cajas:clear(color.verde)
 caja = {}
 caja[1] = { x = 180, y = 242, height = cajas:height(), width = cajas:width() }
 caja[2] = { x = 380, y = 202, height = cajas:height(), width = cajas:width() }
 caja[3] = { x = 450, y = 142, height = cajas:height(), width = cajas:width() }
--Array del personaje.
personaje = {}
personaje.y = 169
personaje.x = 50
personaje.velocidadSalto = 10
personaje.estadoSalto = "suelo"
personaje.estadoColision = "Normal"
personaje.width =  ace:width() 
personaje.height =  ace:height()
 
 function comprobarColision(object)
 --separar if para evitar minisalto al solo colisionar en x
 if (personaje.x + personaje.width > object.x) and (personaje.x < object.x + object.width)and  (personaje.y + personaje.height > object.y) and (personaje.y < object.y + object.height)  then
personaje.x = oldx
personaje.y = oldy
--insertar if para suelificar y evitar caida infinita
--if personaje.x > object.x and personaje.y > object.y and personaje.x < object.x + object.width and personaje.y < object.y + object.height then
personaje.estadoSalto = "suelo"
elseif personaje.y ~= 169 then
personaje.estadoSalto = "suelo"
end
end
 
 
 
 
--Bucle principal-----------Bucle principal-------Bucle principal-------Bucle principal-------Bucle principal-------Bucle principal-------Bucle principal-----------------------------------------------------------------------------------------------------------------------
while true do
oldx = personaje.x
oldy = personaje.y
  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
 
if pad:cross() and personaje.estadoSalto == "suelo" then
     personaje.estadoSalto = "saltando"
	 personaje.xinicio = personaje.x
  end
 
if personaje.estadoSalto == "saltando" then
     personaje.velocidadSalto = personaje.velocidadSalto - 0.5
     personaje.y = personaje.y - personaje.velocidadSalto
  end
 
if personaje.velocidadSalto < 0 then
     personaje.estadoSalto = "cayendo"
  end
 
if personaje.y < 169 and personaje.estadoSalto == "cayendo" then
     personaje.velocidadSalto = personaje.velocidadSalto + 0.5
     personaje.y = personaje.y + personaje.velocidadSalto
  end
if personaje.y > 169 then personaje.y = 169 end
personaje.y = personaje.y 
comprobarColision(caja[1])
comprobarColision(caja[2])
comprobarColision(caja[3])
screen:blit(personaje.x,personaje.y,personaje1)
  screen:blit(0,262,suelo)
 screen:print(280,10, "Tamaño Ace:" .. ace:height() .. "x" .. ace:width(), color.celeste)
screen:print(10,10,"X: "..personaje.x.." Y: "..personaje.y,color.verde)
  screen:print(10,20,"estadoSalto: "..personaje.estadoSalto,color.verde)
  screen:print(10,30, "Estado Colision:" .. personaje.estadoColision, color.rojo)
 
 for a = 1,3 do 																	---blitear bloques
screen:blit(caja[a].x,caja[a].y,cajas)
end
 
 
 
if personaje.y == 169 then -- detiene el salto
     personaje.velocidadSalto = 10
     personaje.estadoSalto = "suelo"
 
  end
screen.waitVblankStart()
  screen.flip()
end

Imagen de tomy_molina

error inesperado

codigo fuente :

--Salto--
 
--Creamos los colores--
verde=Color.new(0,255,0)
blanco=Color.new(0,255,0)
 
--Ahora el suelo--
suelo = Image.createEmpety(480,10)
suelo:clear = verde
 
--personaje--
personaje1 = Image.crateEmpety(32,32)
personaje1:clear(blanco)
 
--Array del personaje.
personaje = {}
personaje.gravedad = 230
personaje.y = 230
personaje.x = 50
personaje.velocidadSalto = 10
personaje.estadoSalto = "suelo"
 
--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
 
if pad:cross() and personaje.estadoSalto == "suelo" then
     personaje.estadoSalto = "saltando"
  end
 
if personaje.estadoSalto == "saltando" then
     personaje.velocidadSalto = personaje.velocidadSalto - 0.5
     personaje.gravedad = personaje.gravedad - personaje.velocidadSalto
  end
 
if personaje.velocidadSalto &lt; 0 then
     personaje.estadoSalto = "cayendo"
  end
 
if personaje.gravedad &lt; 230 and personaje.estadoSalto == "cayendo" then
     personaje.velocidadSalto = personaje.velocidadSalto + 0.5
     personaje.gravedad = personaje.gravedad + personaje.velocidadSalto
  end
if personaje.gravedad == 230 then
     personaje.velocidadSalto = 10
     personaje.estadoSalto = "suelo"
  end
 
if personaje.gravedad &gt; 230 then personaje.gravedad = 230 end
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

 

 

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 .

 

 

 

Imagen de PhAnThOm

Image.createEmpEty - Image.createEmpty

--Ahora el suelo--
suelo = Image.createEmpety(480,10)

es asi:

suelo = Image.createEmpty(480,10)

Imagen de rat100

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

Imagen de Divod

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

Imagen de PhAnThOm

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

Imagen de ELeNDeR

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.

Imagen de ELeNDeR

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

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.