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)
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
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()
end
frames:reset(0)
end
while true do
end
System.setHigh() Ahi esta
System.setHigh()
Ahi esta todo.
Saludos
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...
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.
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.
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