Anuncios Google

[LUA]Por favor necesito Ayuda en LUA

Buenas programadores, estoy intentando hacer un juego basado en el jump duck link, un juego saltando pero este se llamara Kakashi adventures, bueno mi problemas es que esta muy lento y ya he dado valor nil a las variables e imagenes y he puesto la funcion collectgarbage() para que recolecte la basura, pero aun asi esta muy lento, quiero que alguien me ayude si es tan amable por favor.

Aqui les dejo mi codigo. quiero que se fijen en la ultima parte que es en donde intento limpiar la memoria, espero su ayuda.

sc1 = Image.load("correr/C1.png")
sc2 = Image.load("correr/C2.png")
sc3 = Image.load("correr/C3.png")
sc4 = Image.load("correr/C4.png")
sc5 = Image.load("correr/C5.png")
sc6 = Image.load("correr/C6.png")

fondo = Image.load("IMG/fondo.png")
terreno = Image.load("IMG/Terreno.png")
nube = Image.load("IMG/nube.png")
fortaleza = Image.load("IMG/vida.png")

--sonidos
System.oaenable()
vida = Sound.load("Sonidos/vida.wav")
score = Sound.load("Sonidos/score.wav")

piso = { x = 0, y = 260, img = terreno}

nub = {}
nub[1] = { x = 300, y = 60, img = nube }
nub[2] = { x = 450, y = 10, img = nube }
nub[3] = { x = 200, y = -10, img = nube }

vid = { x = math.random(480,1000), y = math.random(-6,210), ancho = 40, alto = 42, img = fortaleza }

--arrays
jugador = {
img = sc1,
gravedad = 190,
estadoSalto = "suelo",
velocidadSalto = 11,
y = 190,
x = 100,
ancho = 70,
alto = 87,
paso = 0,
puntuacion = 0,
vida = 100,
}

function Salto()

if pad:cross() and oldpad:cross() ~=pad:cross() and jugador.estadoSalto == "suelo" then
jugador.estadoSalto = "saltando"
end

if jugador.estadoSalto == "saltando" then
jugador.img = sc3
jugador.velocidadSalto = jugador.velocidadSalto - 0.3
jugador.gravedad = jugador.gravedad - jugador.velocidadSalto
end

if jugador.velocidadSalto < 0 then
jugador.estadoSalto = "cayendo"
end

if jugador.gravedad < 190 and jugador.estadoSalto == "cayendo" then
jugador.img = sc4
jugador.velocidadSalto = jugador.velocidadSalto + 0.3
jugador.gravedad = jugador.gravedad + jugador.velocidadSalto
end

if jugador.gravedad == 190 then
jugador.velocidadSalto = 11
jugador.estadoSalto = "suelo"
jugador.img = sc1
end

if jugador.gravedad > 190 then
jugador.gravedad = 190
end
jugador.y = jugador.gravedad
end

function paso_automatico()

if jugador.paso >= 1 and jugador.paso <= 5 and jugador.estadoSalto == "suelo" then
jugador.img = sc1
elseif jugador.paso >= 5 and jugador.paso <= 10 and jugador.estadoSalto == "suelo" then
jugador.img = sc2
elseif jugador.paso >= 10 and jugador.paso <= 15 and jugador.estadoSalto == "suelo" then
jugador.img = sc3
elseif jugador.paso >= 15 and jugador.paso <= 20 and jugador.estadoSalto == "suelo" then
jugador.img = sc4
elseif jugador.paso >= 20 and jugador.paso <= 25 and jugador.estadoSalto == "suelo" then
jugador.img = sc5
elseif jugador.paso >= 25 and jugador.paso <= 30 and jugador.estadoSalto == "suelo" then
jugador.img = sc6
end
if jugador.paso >= 30 then
jugador.paso = 1
end
end

function mov()
jugador.paso = jugador.paso + 1
piso.x = piso.x - 1.5
if piso.x < -480 then
piso. x = 0
end
end

function movNube()
for a = 1,3 do
screen:blit(nub[a].x,nub[a].y,nub[a].img)
nub[a].x = nub[a].x - 0.8
if nub[a].x < -490 then
nub[a].x = 490
end
end
end

function movVida()
vid.x = vid.x - 2
if vid.x  < -20 then
vid.x = math.random(480,1000)
end
end

function colisionVida()

if (jugador.x + jugador.ancho > vid.x) and (jugador.x < vid.x + vid.ancho) and (jugador.y + jugador.alto > vid.y) and (jugador.y < vid.y + vid.alto) then
vida:play()
jugador.puntuacion = jugador.puntuacion + 40
vid.x = math.random(480,1000)
vid.y = math.random(-6,210)
end
end

oldpad=Controls.read()

while true do
screen:clear()
pad = Controls.read()

if pad:start() then
break
end

Salto()
paso_automatico()
mov()
movVida()
colisionVida()

screen:blit(0,0,fondo)
screen:blit(piso.x, piso.y, piso.img)
screen:blit(piso.x + 480, piso.y, piso.img)
movNube()
screen:blit(jugador.x,jugador.y, jugador.img)
screen:blit(vid.x,vid.y,vid.img)

screen:print(390,10,"score: "..jugador.puntuacion,rojo)

screen.waitVblankStart()
screen.flip()
oldpad = pad
end

fondo = nil
terreno = nil
nube = nil
sc1=nil
sc2=nil
sc3=nil
sc4=nil
sc5=nil
sc6=nil
fortaleza = nil
salto = nil
mov = nil
movVida = nil
colisionVida = nil
movNube()
nube = nil
vida = nil
collectgarbage(); System.sleep(100)


Anuncios Google

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 pipagerardo

Os voy ha contar un secretillo.

Para hacer un buen homebrew es muy conveniente programar una función que reproduzca entre 30 y 40 frames por segundo. Lo tipico que hacen los nuevos coders es los siguiente:

while true do

-- calculo de procesos

screen.waitVblankStart()

screen.flip()

end

 

Pero este sistema tiene un gran problema, cuando empiezas a programar y tienes pocos calculos el código corre a las mil maravillas y seguramente se muestren en pantalla 60 frames por segundo. Visto esto se aplican desplazamientos muy pequeños en coordenadas del estilo a x = x + 0.8, mientras el código corre a 60 frames todo marcha bien. Pero segun se amplia el programa y va bajando la velocidad a 30 frames por segundo todo se relentiza y los desplazamientos son demasiado lentos.

Por eso es importante primero programar una función que asegure de 30 a 40 frames por segundo independientemente de la cantidad de procesos o cálculos que se realicen. Ahora comprobareis que a esa velocidad el desplazamiento típico de las coordenadas viene siendo del orden de 3 a 6 pixeles por fotograma. x = x + 6.

Y despues de todo esto si el programa es demasiado grande y complejo en cálculos se puede subir un poco la velocidad de la CPU...

Espero haberme explicado bien...

Un Ejemplo a 25 fotogramas por segundo:

frames = Timer.new()

function mostrar_pantalla()

screen.waitVblankStart()
screen.flip()
while frames:time() < 40 do

System.sleep( 4 )

end
frames:reset(0)

end

while true do

 frames:start()

-- Calculos y Procesos

mostrar_pantalla()

end

Imagen de P22

System.setHigh() Ahi esta

System.setHigh()

Ahi esta todo.

Saludos

Imagen de pipagerardo

System.setHigh()

Pues yo discrepo sobre poner la PSP a 333MHz por sistema. En el juego LUA-1945 se llega fácilmente a unos 50 procesos simultáneos y con System.setcpuspeed(266) va que sobrado.

Primero hay que optimizar la programación, y cuando ya no se pueda optimizar más pues se sube un poco la velocidad de la CPU.

Seré un maniático pero no me gusta nada poner la PSP a 333MHz cuando no es necesario. El programa de cyberboy solo necesita ser depurado para que funcione mejor.

Que no pasa nada por poner la PSP a 333MHz solo que dura menos la batería y se calienta un poco...

Imagen de pipagerardo

Respuesta.

Si te va lento el juego no creo que tenga nada que ver con "nil" ni con "collectgarbage" puesto que en ese caso se cuelga como una perra la consola y punto.

En mi opinion puede ser que el desplazamiento sea demasiado pequeño. Creo que te desplazas un pixel en cada paso y eso es muy poco. Normalmente un sprite se desplaza entre 6 y 10 pixel para un movimiento ligero y suave.

Si subes un Zip o RAR con todo el código y el resto de archivos te prometo hecharle un ojo. Pero a simple vista parece que esta bien.

Ya lo he arrreglado

Jeje, sii ya lo arregle, pues me fije que en LUA cuando tienes muchas imagenes en pantalla se relentiza el juego, y pues tuve que quitar una nube para que pueda ir bien, pero aun se relentiza cuando aparece las demas imagenes pero es mas pasbale.

Lo tendre aqui pronto.

Imagen de CkFra

Prueba

a usar variables locales en vez de globales. Yo realmente no tengo mucha idea, porque probarlo, aún no puedo; pero se lo leí a pipagerardo en un coment de los suyos que tanto bien nos hace xDD

En este momento no sé dónde lo puso ni nada, supongo que en foro programación.

Sino encuentras nada, léete su tutorial, que tiene posteado en su web.

Saludos

Ya me lo lei

Gracias a su tutorial y a los de  aqui el codigo que estas viendo es funcional.

Peor ahora me convenso mas de que no son las imagenews ni variables, pues he dado valor nil a  imagens y variables al final del codigo y despues uso la funcion collectgarbage(), para iniciar el ciclo de limpieza.

Peor aun asi, se relentiza, cada determinado tiempo cuando se juega y pues asi no va.

Alguna otra idea compañero.

Imagen de CkFra

Pues

prueba a restructurar el código, a limpiarlo, cambiar peso de imágenes y canciones... para que tarde menos en leer el código y ejecutarlo. Prueba a meter las funciones en un script, las imagenes en otro, música en otro... y en el script principal llamas a todas.

Prueba distintas formas, si crees que por las imágenes no es la ralentización

Saludos

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.