Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Marth en Abril 06, 2022, 06:26:57 PM

Título: Sistema de iluminación eficiente [Solucionado]
Publicado por: Marth en Abril 06, 2022, 06:26:57 PM
Verán, quiero poner zonas oscuras en las que el jugador tiene un campo de visión.
Para eso, tengo este script:

function oscuro(oscuridad,distancia){
   draw_set_alpha(oscuridad)
   var ancho=Jugador.x-camera_get_view_x(view_camera[0])
   var alto=Jugador.y-camera_get_view_y(view_camera[0])
   for(var a=0; a<512; a++)
      for(var b=0; b<512; b++)
         if(point_distance(ancho,alto,a,b)>128)
            draw_point(a,b)
   draw_set_alpha(1)
}


512es el ancho y el alto de la view. Aún no termino de dominar las variables de camara de GMS2, aparte de que supongo que así es más eficiente.

Gracias a eso logro un efecto como el mostrado en la captura de pantalla.
Pero hay un problema: ¡Que el juego se pone horriblemente lento si lo hago así!
¿Hay una forma de repetir este efecto que no ralentice el ordenador?
Título: Re: Sistema de iluminación eficiente
Publicado por: Yuki Nagato en Abril 07, 2022, 12:04:28 AM
En ese caso puedes optar por usar una surface. lo cual te permite hacer operaciones de dibujo o en este caso, borrar parte.
la idea sería:
es la manera mas eficiente que se me ocurre en vez de simplemente poner tantos puntos
otra sería usar shaders, pero no se que tal te ves con eso.
Título: Re: Sistema de iluminación eficiente [Solucionado]
Publicado por: Marth en Abril 07, 2022, 01:02:21 AM
Vale, este serían el modo de hacer un efecto de iluminación con superficies:

Crear Superficie.
surf=surface_create(room_width,room_height)

Evento draw.
draw_self()
surface_set_target(surf)
draw_clear_alpha(c_black,0)
draw_set_color(c_black)
draw_rectangle(0,0,room_width,room_height,0)
gpu_set_blendmode(bm_subtract)
draw_set_alpha(0.10)
for(var i=0; i<10; i++)
   draw_circle(x,y,100+i*5,0)
draw_set_alpha(1)
gpu_set_blendmode(bm_normal)
surface_reset_target()
draw_surface(surf,0,0)


Destruir Superficie.

surface_free(surf)