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?
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:
- Crear una surface
- Pintar la surface de negro (pero con el alpha a 0.5, por ejemplo)
- Ubicar el centro del personaje
- Recortar parte de la surface con el blend_mode en subtract
- Dibujar el resultado
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.
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)