Anuncios Google

Animación Explosión LuaDev

Hola, estoy tratando de crear una animacion de una explosion cada vez que un objeto colisione con otro.

function explosion()
 
	for i = 0,120,40 do
 
		image.blit(img_explosion,Acarro.x,Acarro.y,0+i,0,40,40)
 
	end
 
end

A la funcion explosion la llamo dentro de otra funcion que es la de "colision" el problema es que al parecer las imagenes se muestran tan rapidamente que no permite ver la animacion de la explosion como deberia de ser, lento y que se vean bien cada una de las imagenes.

La imagen es un sprite de plantilla de 160*160 y divida en cuadros de 40*40, en el codigo de arriba solo muestro la primera linea de imagenes, quiero mostrar las 4 lineas, pero primero que funcione correctamente.

Si algun coder me diera una mano(y)

Salu2


 


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.

Si no tienes memoria

Si no tienes memoria suficiente, te cargas las imagenes que no uses

imagenaeliminar = nil
collectgarbage()
 
--Creo que en Dev es
imaegnaeliminar:free()


We're off now to seek all our fortunes to the land... of... our dreams

Lo que te dice Deviante es lo

Lo que te dice Deviante es lo mejor que puedes hacer, pero para los que vamos empezando puede ser complejo (para mí si lo es xD).
Te mostraré como trabajar con sprites de una manera muy sencilla, estoy seguro que podrás adaptarlo a tus necesidades una vez que veas como se hace:

tim = image.loadsprite("tim.png",42,49) --Primero cargo mi sprite, con cuadros de 42x49 cada uno
 
cuadro = 0
minitimer=0
 
function correr() --La función que hace toda la magia jejeje
 
	if cuadro>7 then cuadro = 0 end --Si ya me pasé del cuadro donde sigue corriendo, vuelvo a empezar.
 
 
		if minitimer==10 then  --cada 10 ciclos, reinicio mi contador y preparo el siguiente cuadro de mi sprite
			minitimer = 0
			cuadro = cuadro + 1
		end
 
			tim:setframe(cuadro)     --Bliteo mi sprite.
			tim:blit(100,100)
 
			minitimer = minitimer + 1			
 
end
 
while true do
 
	controls.read() --Leo mis controles
 
		if controls.right() then  --Si presiono la flecha derecha, que corra xD
			correr()
		else                           -- Si no, pues lo bliteo quieto
			tim:setframe(12)
			tim:blit(100,100)
		end	
 
			screen.flip()        --Muestro mis cambios en pantalla
 
end

Animaremos a Tim:

No le prestes atención a lo feo del sprite, no lo hice a conciencia, sólo para probar xD

Como te podrás dar cuenta en el código, se blitea el mismo cuadro del sprite 10 veces, para que no vaya tan rápido la animación. Después, cambia el cuadro del sprite, y se blitea 10 veces antes de cambiar de nuevo. Una forma muy sencilla de animar, y con control total de los retrasos entre cuadro y cuadro. Si te parece que la animación va muy rápido, o muy lento, es cosa de modificar el valor en la condición de la línea 11 y ya está

Saludos

Imagen de NauTiluS1

Emmmmm si tengo el code tuyo

Emmmmm si tengo el code tuyo en un script me f y la imagen me funcionara?

Supongo que si, aunque te

Supongo que si, aunque te advierto que no lo probé, bien pudiera ser que se me haya escapado algo por ahi :P

Imagen de NauTiluS1

O.O Ahora lo pruebo y te

O.O Ahora lo pruebo y te digo

EDITADO: no enough memory, que es eso?


Editado: Crear hilos y comentarios duplicados incumple las Normas de la Comunidad, si necesita cambiar su comentario puede usar la opción de Editar. Antes de volver a postear por favor revise las Normas.| Rober Galarga


Follow me twitter nautilus1_jmccu!!
Sony, ya a nadie le interesa tus UMD si alguien compra una psp es por nosotros los coders. Madura y has un FW que haga la diferencia y anime a las personas en comprar un PSP

Literalmente dice que no

Literalmente dice que no tiene suficiente memoria. No sabría decirte que hacer... cuando yo usé ese sprite me funcionó muy bien :S

Imagen de ANI-KIBA

Justamente

para hacerlo correr rapido, y bien, solo pon el XMB a 333, Saludos! (O desde luadev, la memoria la pnes a 333, y listo!! :D)

Imagen de Chimecho

memoria?

no es a a la memoria a la que le cambias la velocidad, es al cpu que se le pone 333MHz

Imagen de barney77

Hahaha

Hahaha TIM xD...¿Amigo te molesta si pongo a TIM como mi avatar? :D, me gusto ese TIM xD.

 

Saludos.

Adelante, Tim no es creación

Adelante, Tim no es creación mía (por eso tiene nombre xD). Yo sólo monté ese sprite ;)

Imagen de barney77

Haha

Haha ok =).

Imagen de iRVing_Prog

Genial

Algo asi es lo que buscaba, a claro que no estoy demeritando el trabajo de Dev pero es mas "pro" su codigo y no logro entenderlo al 100 por 100.

Estaba pensando algo parecido a esto que has puesto, con variable y sumar uno a cada pasada del bucle para mostrar la animacion, es parecido, pues solo lo tenia en la mente :D.

Vere si mas de rato me pongo con el codigo.

Salu2 Rober


 

Imagen de DeViaNTe

:P

Ehm, por lo que veo, te estas complicando mucho, vienes de hm. xD
En LuaDEV puse una funcion especificamente para sprites, para no complicar las cosas.

Al cargar la imagen, cambia load por :

img_explosion = image.loadsprite('ruta.png',40,40);

Con esto ya tenemos pues... los frames que sean, k si calculo bien son 16, amos, contando desde 0, tienes los frames del 0 al 15.

Lo que haces con ese while es pintar TODOS los frames a la vez, con lo que no es que sea rapido, es que no lo vas a ver.

Para hacer un juego pintamos frame a frame, partiendo de ahi, no podemos pintar una animación del tirón, es decir, con un for, por que no verás animación, verás un momento aparecer y desparecer tu ultima imagen de la explosión.

pongamos que tienes un code tal que así:

while true do
  leercontroles();
 
  moverpersonaje();
 
  pintarfondo();
  pintarpersonajes();
 
  screen.flip();
end

Antes del screen.flip, deberías mostrar la animación, pero ojo, no toda, si no un frame. Al siguiente ciclo, despues de volver a leer controles, pintar fondo, pintar personaje, entonces, pintar el siguiente frame, y vuelta a empezar, así los 15 frames.

Te recomiendo que estudies la posibilidad de crear una tabla y algunas funciones para que lo puedas poner antes del screen.flip() y que se haga todo solo...

Algo tal que así:

-- una tabla para los efectos.
efectosespeciales = { };
 
-- cada efecto tendrá esto:
--     tipo: uno de los siguientes "explosion","peo".
--     x: posicion x donde se pintara.
--     y: posicion y donde se pintara.
--     frame: frame actual.
--     endframe: frame final.
 
 
-- con esa teoría, preparamos la funcion añadir efecto:
-- esta creara una tabla, le dara las propiedades antes
-- definidas, y preparara el frame final segun la animacion.
-- una vez preparada, la metera en la tabla "efectosespeciales".
function addspecialfx(tipo,x,y)
 
   local nuevoefecto = { };
   nuevoefecto.tipo = tipo;
   nuevoefecto.x = x;
   nuevoefecto.y = y;
   nuevoefecto.frame = 0;
 
   if ( tipo == 'explosion' ) then 
      nuevoefecto.endframe = 15;
   end
 
   if ( tipo == 'peo' ) then
      nuevoefecto.endframe = 12;
   end
 
   table.insert(efectosespeciales,nuevoefecto);
 
end
 
 
-- ahora la funcion para pintar los efectos en la pantalla.
function pintaefectos()
 
   -- recorrer todos los efectos...
   for i=1, #efectosespeciales do
 
     -- para cada efecto, segun su tipo elegir la imagen
     -- y blitearla en su sitio, y luego aumentar el frame
     local tipo = efectosespeciales[i].tipo;
     local x = efectosespeciales[i].x;
     local y = efectosespeciales[i].y;
 
     if (tipo == "explosion") then
        -- poner el frame que toca.
        imagen_explosion:setframe(efectosespeciales[i].frame);
        -- pintarlo donde toca
        imagen_explosion:blit(x,y);
        -- aumentar el frame
        efectosespeciales[i].frame = efectosespeciales[i].frame + 1;
     end
 
    if (tipo == "peo") then
      -- ....
    end
 
   -- akaba recorrido de efectos.
   end
 
  -- borrar los efectos que ya hayan acabado.... para hacerlo facil,
  -- creamos una nueva tabla, con los que NO han acabado.
  local nuevatabla = { };
  for i=1, #efectosespeciales do
    if ( efectosespeciales[i].frame < efectosespeciales[i].endframe ) then
      table.insert(nuevatabla,efectosespeciales[i]);
    end
  end
  -- y esta nueva tabla, la volvemos a meter en efectosespeciales...
   efectosespeciales = nuevatabla;
 
end

Vale, con eso, en el momento de colisionar, añadimos efecto, y en el while, antes del flip, pintarefectos. los efectos iran por libre y se eliminaran de la tabla cuando akaben, y no mostraremos todos los frames en el mismo frame, con lo que la animación será animada.

:P espero le sirva a alguien

un saludo,
 Dev.


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Imagen de iRVing_Prog

Gracias Dev

Se ve algo extenso para solo una animacion :). Pero tratare de entenderla y ver si puedo crearme algo mas simple.

Salu2

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.