Agosto 14, 2017, 03:05:55 AM Ultima modificación: Agosto 15, 2017, 03:20:59 AM por Naitsabes0
Perdí información que cree hace meses, entre ellas la programación de la linterna, busque en la sección "Buscas" para ver si tenia una respuesta a esta pregunta, pero al parecer fueron borradas por una caída que tuvo el servidor, por lo que decidí empezar y retomar siguiendo unos tutoriales, sin embargo no logre armarlo de la forma que se debe, esto es lo que tengo después de muchas horas de intentos, se que el tema es muy viejo, pero es un elemento importante que forma parte del juego que estoy creando.

El sprite


obj_Jugador
evento draw:
///Creacion de la linterna
//para la apariencia de la linterna
draw_set_blend_mode(bm_add)
draw_sprite_ext(spr_Luz,0,x,y,5,5,45,c_white,0.2)
draw_sprite_ext(spr_Luz,0,x,y,1,1,0,c_white,1)
draw_set_blend_mode(bm_normal)

//para que se vea el personaje.
draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,image_angle
,image_blend,image_alpha)

obj_Oscuridad
evento draw:
///Dibuja la oscuridad
depth = 1; //ajusto la profundidad
draw_set_color(c_black)
draw_set_alpha(1) // 1 oscuro total 0.5 poco oscuro
draw_rectangle(view_xview[0]-2,view_yview[0]-
2,view_xview[0]+view_wview,view_yview[0]+view_hview,0)
draw_set_color(c_white)
draw_set_alpha(1)
//Esto es para hacer un rectángulo negro en la view.

Lo que espero lograr:  :)
GIF de Zelda: A Link to the Past

-La oscuridad sea absoluta y nada se vea hasta ser alumbrado.
-La luz se mueva con el personaje centrado.
-La luz debe mostrar al personaje y lo que le rodea.
Básicamente se resume en el gif de arriba.

Lo que logre:  :(
GIF de una habitación del juego

Pues logre armar la linterna técnicamente, sin embargo la luz no deja ver lo que hay en su interior, se aleja del jugador, la oscuridad no oculta nada, creo que estoy muy lejos de que el código logre crear el sistema de linterna que se ve en el GIF de Zelda, o al menos el comportamiento típico de una linterna circular.   :-\

Si has llegado hasta este punto gracias por leer.  :D

Creo que el GameMaker: Studio viene con un tutorial de ello, ahí hay un código completo de eso. Puede que te sirva.
alaberga regué el café.

BA:STFW&RTFM

Cita de: NiuWeb en Agosto 14, 2017, 03:26:37 AM
Creo que el GameMaker: Studio viene con un tutorial de ello, ahí hay un código completo de eso. Puede que te sirva.

:o Vaya GM:S tenia esta función todo el tiempo? realmente interesante, el código es grande y esta en ingles, se ve algo complicado de lo que espere desde un principio, veré como me resulta.  :), pero todavía lo tendré como pendiente.

Cita de: NiuWeb en Agosto 14, 2017, 03:26:37 AM
Creo que el GameMaker: Studio viene con un tutorial de ello, ahí hay un código completo de eso. Puede que te sirva.

No logre armar la linterna en la forma circular para el personaje.  :(


Cita de: Zapdos43 en Agosto 14, 2017, 12:38:46 PM
Los siguientes videotutoriales te podrían ayudar:
Video 1: https://www.youtube.com/watch?v=dYbCfhX3Hu4
Video 2: https://www.youtube.com/watch?v=xU6w0oXRoz0&t=726s

Espero te sirvan.

Después de estar interpretando el código de los tutoriales de ingles, llegue a armar lo que buscaba, sin embargo la linterna oculta al personaje y no he visto la razón de porque esta ocurriendo, le he cambiado las "depth" en el acceso rápido al jugador para que tenga -1000, ya que el sprite invisible de la luz tiene -999.

Esto es lo que logre armar durante muchas horas de prueba y error.

obj_Luz "sin sprite"
depth -999
create:
///Crear la superficie

superficie = surface_create(room_width, room_height);

surface_set_target(superficie);
draw_clear_alpha(c_black, 0);

//Reinicia la superficie
surface_reset_target();

step:
///Control de la oscuridad
if (surface_exists(superficie)){
    surface_set_target(superficie);
   
    //conjunto oscuridad
    draw_set_colour(c_black);
    draw_set_alpha(1); //intencidad de la oscuridad 0 nada 1 absoluta
    draw_rectangle(0, 0, room_width, room_height, false);
   
    //conjunto circulos
    draw_set_blend_mode(bm_subtract);
   
   
    draw_set_colour(c_black);
    draw_set_alpha(0.2);
   
   
    // dibuja circulos
    with (obj_Jugador) {
        draw_circle(x + random_range(-1,1), y + random_range(-1,1), 80 + random_range(-1, 1), false);
       
        }
       
        draw_set_colour(c_white);
        draw_set_alpha(1);
       
        with (obj_Jugador) {
        draw_circle(x + random_range(-1,1), y + random_range(-1,1), 45 + random_range(-1, 1), false);
       
        }
       
       
       
    //Reinicia todo el conjunto dibujo
    draw_set_blend_mode(bm_normal);
    draw_set_alpha(1);
    surface_reset_target();
} else {
    superficie = surface_create(room_width, room_height);
    surface_set_target(superficie);
    draw_clear_alpha(c_black, 0);
    surface_reset_target();
}

room end:
/// destruir la superficie
if (surface_exists(superficie)) {
    surface_free(superficie);
}

draw:
///Dibuja la superficie

if (!surface_exists(superficie)) {
    superficie = surface_create(room_width, room_height);
} else {
    if (view_current == 0) {
        draw_surface(superficie, 0, 0);
    }
}

Enhorabuena por tu esfuerzo.

En cuanto al problema del personaje invisible prueba a crear un evento Draw en el personaje con el código:
draw_self();

En caso de que funcione (que no sé si funcionará) es porque habías declarado dibujar círculos dentro del objeto del personaje. Como esta parte de tu código:
// dibuja circulos
    with (obj_Jugador) {
        draw_circle(x + random_range(-1,1), y + random_range(-1,1), 80 + random_range(-1, 1), false);
       
        }