Efecto de desintegración

-Autor: Mega-G
-Explicación: Hace explotar un sprite y lo descompone en muchos píxeles.

Añado un vídeo que hice para mi página pero que os mostrará como se ve el efecto:
(mirad hasta el minuto 0:30, luego ya es otra cosa).


-Versiones: GM7, GM8 y GMStudio

-Scripts:


crear_cuadricula(size) (size es un entero que divide sprite_width y sprite_height).
(por ejemplo si el sprite mide 128x128, las size que puedes poner serían 1,2,4,8,16,32,64)

Este script irá en el evento <Create>:


size=argument0
for(i=0; i<=sprite_width; i=i+1*size)
{
for(j=0; j<=sprite_height; j=j+1*size)
{
px[i,j]=i
py[i,j]=j
}
}


Lo que hace es crear una cuadrícula formada por bloques. Cada bloque es cuadrado y su lado corresponde al valor del argument0. Cuanto más pequeño es el argument0 más realista queda ya que habrá más bloques. Pero consumirá más recursos y puede que el juego ralentice.

dibujar_efecto(desintegrarse) (desintegrarse es un boolean. Cuando vale true empieza la animación. Si vale false la pausas.)
Este script irá en el evento <Draw>


desintegrarse=argument0
for(i=0; i<=sprite_width; i=i+1*size)
{
for(j=0; j<=sprite_height; j=j+1*size)
{
draw_sprite_part(sprite_index,image_index,i,j,size,size,x+px[i,j],y+py[i,j])

if desintegrarse=true
{
px[i,j]-=cos(degtorad(point_direction(x+i,y+j,x+sprite_width/2,y+sprite_height/2)))*(5+random(10))
py[i,j]+=sin(degtorad(point_direction(x+i,y+j,x+sprite_width/2,y+sprite_height/2)))*(5+random(10))
}

}
}


Aquí dibuja cada uno de esos bloques creados en el primer script. Y cuando desintegrarse vale true, aleja cada bloque del centro.
Para alejarlos mide la dirección entre cada punto y el centro del sprite (x+sprite_width/2 , y+sprite_height/2) y mueve cada bloque usando las funciones trigonométricas sin y cos.


El ejemplo del vídeo lo podéis bajar aquí: http://guinxu.com/downtut.php?link=17.
(Lo que pasa que no está en script, lo he puesto "a lo bruto" en los eventos <Create> y <Draw>).
Es un editable de GM7 pero lo podéis importar a GM8 y GMStudio sin problemas, lo he comprobado y todo es compatible.


Espero que le sirva a alguien, y a ver si lo veo en algún juego jeje. Sois libres de utilizarlo.
Cualquier duda que tengáis sobre el script os leeré e intentaré resolverla.

Un saludo!

Excelente aporte!
The next best thing to knowing something,
is knowing where to find it.

yo lo hice con gif si lo hubiera tenido jejej muy buen aporte

que chulo! lo probare se ve un buen efecto

¡Esta muy bien!
Aunque es bastante compleja la formula. ¡De la de conceptos que aprendí de repente miranto tu script! ;D

#5 Mayo 11, 2014, 02:47:57 AM Ultima modificación: Mayo 11, 2014, 02:49:28 AM por beto2789
Gracias por el aporte (Y)
:GMS:

Y como seria para un objeto rectangular?

Excelente efecto

Cita de: perfidus en Mayo 31, 2014, 12:28:11 PM
Y como seria para un objeto rectangular?

Excelente efecto

Perdona no entiendo tu pregunta. El sprite que utilizo ya es rectangular, como todos los sprites.
Si me lo explicas más intentaré adaptar el script para tu caso.

hey mega me podrias explicar como funciona en si??es que he hecho un sprite pero me queda descuadrado y me dibuja cosas que no deberia y necesitaria saber como funciona en general y como poder adaptarlo,espero no sea mucha molestia me parece un aporte impresionante que no esta aprovechado lo suficiente y me gustaria poder usarlo en mi proyecto al 100%

Cita de: zorge en Junio 09, 2014, 11:55:51 PM
hey mega me podrias explicar como funciona en si??es que he hecho un sprite pero me queda descuadrado y me dibuja cosas que no deberia y necesitaria saber como funciona en general y como poder adaptarlo,espero no sea mucha molestia me parece un aporte impresionante que no esta aprovechado lo suficiente y me gustaria poder usarlo en mi proyecto al 100%

Si te queda descuadrado supongo que será porque el xorigin y el yorigin del sprite no están en el punto (0,0).

En cuanto al funcionamiento del script ahora te lo explico:

En el evento <Create> define las coordenadas x,y de cada "partícula" de la desintegración. Las llamamos px y py. Y para diferenciarlas tienen 2 subíndices, que corresponden a las coordenadas de su posición inicial.

Luego en el evento <Draw> dibujamos cada uno de esos trozos en su posición px y py que de momento coincide con su posición inicial. Hasta que empieza la desintegración, entonces cada una de esas partículas se mueve en la dirección entre su posición actual y la del centro del sprite, en sentido opuesto para que vaya hacia fuera.

El cosinus corresponde a la cordenada horizontal y el sinus a la vertical. pero funcionan en radianes, por lo que usamos la función degtorad para convertir el ángulo que viene en grados desde la función point_direction.


Ha sido un poco complicado de explicar y hay matemáticas un poco complicadas.
Espero haberme hecho entender, si te ha quedado alguna duda dímelo.

Un saludo!

hey genial la explicacion igual que genial el efecto al principio me ha costado un poco entenderlo pero creo que ya lo cojo voy a hacer alguna pruebas y te dire como me quedo muchisimas gracias por la explicacion y por este maravilloso efecto espero poder usarlo.

wuau muchas gracias, me parece increible,
me suscribo a tu canal.
y gracias de nuevo esta brutal.

Gracias por suscribirte  :)
Espero poder subir algún nuevo efecto pronto,
¡saludos!

#13 Septiembre 18, 2014, 11:22:40 PM Ultima modificación: Septiembre 18, 2014, 11:25:08 PM por TheSandBoxMKG
yo usaría surfaces:

crearia dos surfaces, uno con la imagen original y el otro es donde se dibujará la imagen desintegrada.
surface_copy_part(destination,x,y,source,xs,ys,ws,hs)
con eso copio parte del surface original y lo pongo en el segundo surface
y luego dibujo el segundo surface en la pantalla.

creo que con esto sería mas optimizado en vez de dibujar bastantes sprites.


Hola tengo una duda respecto al script, y es que cuando lo uso en mis sprites, que no tienen origen en (0,0) se ve movido el efecto.
Grabé un video para que se vea el corrimiento del efecto


https://youtu.be/85RjYGVfEWI

Cómo puede solucionarse?

Luego, cabe recalcar que el script no funciona cuando al objeto se le asigna por ejemplo image_xscale = -1, eso me paso probando hahaha
El codigo que uso no tiene mucho enredo.
Cada que le disparas a un enemigo, se setea la variable de "Muerto" en true para que se haga la animación y nada mas.

Asi que deduje que el problema puede ser en el script de dibujo
Ah, me olvide de decir que el origen está por encima del sprite, como por ejemplo y-32, x +16