Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

* Sponsor

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Como mejorar el sistema de sombras.  (Leído 576 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Marth

en: Agosto 11, 2021, 05:23:05 pm
Verán, quiero incluir un efecto de sombras en mi juego que sea eficiente.
De momento, tengo este sistema:

for(var a=x-2; a<x+11; a++)
   for(var b=y-2; b<y+11; b++)
      draw_sprite_ext(sprite_index,0,a,b,1,1,0,0,0.01)
draw_self()


Pero es muy poco eficiente, y queda algo artificial.
He visto que hay mejores formas, pero tras la caida que sufrio esta página hace año muchos de los tutoriales se han perdido.
¿Alguien tiene un scrip con el que hacer un sistema de sombras más efectivo?


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado brunoxzx

Respuesta #1 en: Agosto 12, 2021, 12:52:40 am
Aiño ese sistema sí está anticuado  :P.

Lo normal es un usar una primitiva que te dibuje la sombra. Este tutorial: Parte 1,
Parte 2; estaba en el techblog hace tiempo, no sé si es el tipo de sombras que buscas.

Él método se puede optimizar más todavía si el trabajo de proyectar la primitiva se hace en un shader, que es lo que hago en mi juego, aunque ya con ese sistema queda bastante decente. Si te interesa puedo pasarte esa versión, aunque lo importante creo yo es entender el tutorial.
« Última modificación: Agosto 12, 2021, 12:55:44 am por brunoxzx »

 


Desconectado Marth

Respuesta #2 en: Agosto 12, 2021, 02:29:41 pm
Buscando información encontré este metodo:

Para empezar, creo un objeto Sol, el cual indicará en que dirección va la sombra del objeto y en su evento de creación, pongo esto para indicar el tamaño de las sombras:
#macro lumi 32

En el evento Step del objeto al que le quiero dar una sombra le pongo esto:
lt=point_direction(Sol.x,Sol.y,bbox_left,bbox_top)
rt=point_direction(Sol.x,Sol.y,bbox_right,bbox_top)
ld=point_direction(Sol.x,Sol.y,bbox_left,bbox_bottom)
rd=point_direction(Sol.x,Sol.y,bbox_right,bbox_bottom)


Y en su evento draw, pongo lo siguiente:
draw_set_alpha(0.40)
draw_triangle(bbox_left,bbox_top,bbox_left+lengthdir_x(lumi,lt),bbox_top+lengthdir_y(lumi,lt),bbox_right+lengthdir_x(lumi,rt),bbox_top+lengthdir_y(lumi,rt),0)
draw_triangle(bbox_left,bbox_top,bbox_right+lengthdir_x(lumi,rt),bbox_top+lengthdir_y(lumi,rt),bbox_right,bbox_top,0)
draw_triangle(bbox_left,bbox_bottom,bbox_left+lengthdir_x(lumi,ld),bbox_bottom+lengthdir_y(lumi,ld),bbox_right+lengthdir_x(lumi,rd),bbox_bottom+lengthdir_y(lumi,rd),0)
draw_triangle(bbox_left,bbox_bottom,bbox_right,bbox_bottom,bbox_right+lengthdir_x(lumi,rd),bbox_bottom+lengthdir_y(lumi,rd),0)
draw_triangle(bbox_left,bbox_bottom,bbox_left,bbox_top,bbox_left+lengthdir_x(lumi,lt),bbox_top+lengthdir_y(lumi,lt),0)
draw_triangle(bbox_left,bbox_bottom,bbox_left+lengthdir_x(lumi,ld),bbox_bottom+lengthdir_y(lumi,ld),bbox_left+lengthdir_x(lumi,lt),bbox_top+lengthdir_y(lumi,lt),0)
draw_triangle(bbox_right,bbox_bottom,bbox_right,bbox_top,bbox_right+lengthdir_x(lumi,rd),bbox_bottom+lengthdir_y(lumi,rd),0)
draw_triangle(bbox_right,bbox_top,bbox_right+lengthdir_x(lumi,rt),bbox_top+lengthdir_y(lumi,rt),bbox_right+lengthdir_x(lumi,rd),bbox_bottom+lengthdir_y(lumi,rd),0)
draw_set_alpha(1)


Como queremos que tenga prioridad el objeto sobre la sombra al mostrarse en pantalla, uso por encima assets del sprite del objeto para así mostrar el objeto en pantalla, en lugar de poner un draw_self.

La ventaja es que Sol puede irse moviendo por el escenario y así movemos las sombras conforme avanza la partida.
Aunque aún dan resultados extraños con las sombras, debido a que al poner varios triangulos con alfa inferior a 1, se superponen.


 


Warning: Parameter 1 to spoiler_buffer() expected to be a reference, value given in Unknown on line 0

Warning: Parameter 1 to custom_report_ob() expected to be a reference, value given in Unknown on line 0