Hola a todos, hace tiempo cree un tema para saber como hacer juegos de Survival Horror, pues ahora que estaba preparando la tematica para el Juego me estaba preguntando como hacer las Sombras y la Iluminacion
Pues ahi la pregunta como hacerlo, estaba usando un truco sencillo para lograrlo, cree un objeto lampara y en el una variable para determinar si estaba encendida
///Evento Create
global.lampara = false; depth = -100;
///Evento Draw
if (global.lampara) draw_sprite(spr_lampara, 1, obj_player.x, obj_player.y) else draw_sprite(spr_lampara, 0, obj_player.x, obj_player.y)
El truco esta en las subimagenes, la subimagen 0 es un rectangulo negro de 640×480, y la subimagen 1 es exactamente igual excepto que en el centro voy reduciendo la opacidad para crear ese efecto de que esta iluminando
Parece funcionar bastante bien pero el problema es que tendria que empezar el Juego con la lampara activada pero lo que yo quiero es entrar en un cuarto ya iluminado y ahi agarrar la lampara, como haria para lograr esa iluminacion pues si lo hago con sprite tendria que usar multiples Sprites y modificar manualmente cada uno y eso seria tarduoso y molesto
Conocen algun metodo mas eficiente para conseguir ese efecto
amigo el otro dia encontre un ejemplo para hacer luces con colores pero seguro te sirve https://www.comunidadgm.org/index.php?page=verdescargas&accion=descargaD&download_id=2360
Eso me serviria para una lampara de advertencia
Mi pregunta va mas alla, sobre la profundidad en la oscuridad y las lamparas encima de esa oscuridad, si sin duda va mucho mas alla
No necesitas crear un sprite de ese tamaño, sino crear una surface de ese tamaño, pintarla de negro, y con sprites que representes las luces "borrar" la surface en donde esten las luces.
(http://www.naztail.com/Tutorial%20Gamemaker/tuto_fake_light/tutofl4.jpg)
El recorte se puede hacer de varias formas. Este es un ejemplo en GMLive (https://yal.cc/r/gml/?mode=GL&tabs_lz=NobwRAdghgtgpmAXGA6nANgYwPbwApQDmCANGDgCYLID0NABAKIBucEALtvQMIBOcUdnAA6vYRFHi69TFF6E59AEZRMAa0K9sAVwgVJEJYXoBeZao1bdFAPpQKFABQH6r+sLAALduwAOAZ0Q6XigAdwA6QgBLdk9tJW1-OF4cDjZ2cJwYGgBxdCjsTDhcgFkAGSjWGzgAD1hfdDh-GhgofyFeGiVGvRsYbCpmo3CAK19CDxIXNwAzKHQkkno5hZExCABKAG4DA2kKKISRxV0ZAFuU7XQuVPoqTXt7LjZ6XSh6f21eOaKDfxnTB8vj84DZMPxBHBHAAmACsADYlnD4dt6HRwQJeEDvqo1uJPjiijYkuwbOw5MR2I5-tsDBQQqEwY05I5MDZuhZUXR0D1FLccNcsRA4JpsHsaAcjnyLpgrtgli8MDJ0lp6E1lOgoBAcPQAJ5qiD0TX0bC8KI897q4WiukMsFRFKNMHYQWOACM0IAHEsPd76L6lmzQp4YnBA+zNeoliskrT1gSQTZ+CSyRS4FS4+JxTIIVj-L4zUIZNhDcaE7j6FqOgUxOtNTBfID84XQRjITYZloYMTgbjqTMlgAGEjD+jIkjj5bzRZT1Y+r3zz2ZiDlomduBQmlbNFdU0hPO9opLXXvCBcJL0YVFfwxKC7dbScmtACPXCoRveWlwBlCgK-3dCKIKFiHZ1k8P9sFwGxPDgKJCG8UDxHYEIikcUJl2QvtPGXbNmDkKBDkafw7jgD9iPQABDht8P8AwajdP8tQoXA0NRXUGLMEI9BY7DEIgGpoUY7iYFY7ddUEzimJ45cagAZiE5iRPQsT5Mk4THF4+9xAAYioGYomFD4hEbaQWHSLgAGVjK0iBpH6VgsXQbRrwMdjAUcNyAGp6FkjZ6H6Ch6E8PjxPc0LvN8-yBiCkLVPoDz5IivyApimzpDbLFsEw7EQXoXx8LuQ5tGORy2iNZymgMKIATPdgctxaoaiidp-H7PyQGmVx-ibQ9WwhIQ0KWTT1gAXxs1dQRTcl5HTNq+PpMImUxVkI05bduV5LF+RdU1LxFLRbUWlNujYWwAqhJRu3sCguRoTVyIq4j33uo0qPykJiIvT5WkNG8PlIuBqPQH7DsZZtQ0cetfBHJZ6OPN1bso6iQn9UHiQLCGoZh+gBOPaFEbegroTR8GBqx0c5OPXz1ruwmUdkv5eqTJp01TGaMz4gxdLgfTDIW386DMjguAAEQZGz+eJVmTt6c7HEumwz14Vp0FugK31IyViq4JWVbRlR1FFaxiWQ9NMBgpwjCHbHQhIXidy1krlhLZi0oYbhYCUKJFHVkjCqOLh3veTxcSxJUebgTBOD981tBgAzVCiABniQHwYMp3gm+gAEdtFImD+mIttmMvc9NaK45Cv4KPYHSMNsxvM8c7z-yrnYKIGiiWQ1XQYtBT965m9Ik81XaCj-eKp5wmzDPiIALxLMqOW1MqXjLXqSOOQ18v8RQlQFXbG5kT2Cn8ae0-oWf6AX6BiM0Zr1X1a0PpNfxZWrthz-ESXjp6M6BlBLUKkCs57JHlMobs-gUjOmuF8ZcP9er9mtvQQcOF1g-2ln-PoAD5bdl1vMW6-BNBNEUPMKKJd3yOx1qaFWYARoAF0gA).
Lo difícil es entender cómo funcionan los blend modes.
Bueno nunca he trabajado con surfaces, pero si con eso logro crear una iluminacion pues vere cuanto me toma aprender a usarlas
no se como funcionan las surfaces pero con borrarlas no desaparecerian o es que estas persisten ???
usa un teñido
[gml]draw_set_blend_mode(bm_add)
draw_sprite_ext(spr_Luz,0,x,y,5,5,45,c_white,0.5)
draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle,image_blend,image_alpha);
draw_set_blend_mode(bm_normal)[/gml]
el spr_Luz Logico es la lampara y debe ser blanco con tonos grises claros.
Ya se como funcionan las Surfaces, no tomo mas de 1 dia aprender a usarlas, y el metodo para la Iluminacion es mucho mas optimo que usar varios Sprites
[gml]
/// Event Create del obj_controlador
glovalvar LightOn;
LightOn = false; //Para prender la iluminacion
/// Evento KeyPress "L"
LightOn = !LightOn;
[/gml]
[gml]
/// Event Create del obj_iluminacion
Surf = surface_create(room_width, room_height)
// Limpiar alpha
surface_set_target(Surf)
draw_clear_alpha(c_black, 0)
surface_reset_target()
[/gml]
[gml]
/// Event Room_start del obj_iluminacion
fuerzaS = 0;
fd = 1;
[/gml]
[gml]
/// Event BeginStep
switch(fd) //Gestionar fuerza a la que se expandera y reducira el radio de iluminacion continuamente
{
case 1:
if (fuerzaS < 2) fuerzaS += 0.1; else fd = -1;
break;
case -1:
if (fuerzaS > -2) fuerzaS -= 0.1; else fd = 1;
break;
}
[/gml]
[gml]
/// Event Step del obj_iluminacion
if surface_exists(Surf) {
surface_set_target(Surf) //Iniciar Surface
// Iniciar Oscuridad en la surface
draw_set_alpha(0.9)
draw_set_color(c_black)
draw_rectangle(0, 0, room_width, room_height, false)
// Si esta activa la iluminacion
if (LightOn)
{
draw_set_blend_mode(bm_subtract)
draw_set_color(c_white)
// Iluminacion en el Jugador
with(obj_player) {
//Segunda radio de iluminacion
draw_set_alpha(0.2)
draw_circle(x, y, 38 + other.fuerzaS, false)
//Primer radio de iluminacion
draw_set_alpha(1)
draw_circle(x, y, 20 + other.fuerzaS, false)
}
//Pequeña iluminacion sobre la mira
with(obj_mira) {
draw_set_alpha(0.4)
draw_circle(x-1, y-1, 16 + other.fuerzaS, false)
}
draw_set_blend_mode(bm_normal)
}
//Resetear la surface
draw_set_alpha(1)
surface_reset_target()
}
else
{
event_perform(ev_create, 0)
}
[/gml]
[gml]
/// Event Room End
if surface_exists(Surf)
surface_free(Surf)
[/gml]
[gml]
/// Event Draw del obj_iluminacion
if surface_exists(Surf) //Solo dibujara la surface si existe
draw_surface(Surf, 0, 0)
else
event_perform(ev_create, 0)
[/gml]
Bueno aun no se como funcionan los "Blend Modes" pues me confundio un poco el bm_subtract, de todas formas logre aprender a usar las Surfaces :-[
Por cierto ese codigo es un poco largo, nose si deberia subir la editable en la seccion de Descargas ???