Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

* 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: Sistema de iluminación eficiente [Solucionado]  (Leído 493 veces)

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

Desconectado 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?
« Última modificación: Abril 07, 2022, 01:00:52 am por Marth »

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Yuki Nagato

  • Habitual
  • *
  • Puntos: 36
  • Mensajes: 33
    • Ver Perfil
Respuesta #1 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:
  • 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.

 


Desconectado Marth

Respuesta #2 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)