Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Naitsabes0 en Agosto 14, 2017, 03:05:55 AM

Título: [Resuelto] Trato de armar una linterna pero me sale mal
Publicado por: Naitsabes0 en Agosto 14, 2017, 03:05:55 AM
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
(https://i.gyazo.com/65ca2c09f7571991d58202aff208c96c.gif)

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
(https://i.gyazo.com/330a81cb6dda9fc485db695a1a8982c3.gif)
-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
(https://i.gyazo.com/9d0cfd78a929f2bd4535a552c5d4dc6e.gif)
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
Título: Re:Trato de armar una linterna pero me sale mal
Publicado por: bygdle 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.
(https://image.prntscr.com/image/yisLBauERBWIFk9SIXh-ig.png)
Título: Re:Trato de armar una linterna pero me sale mal
Publicado por: Naitsabes0 en Agosto 14, 2017, 05:02:50 AM
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.
(https://image.prntscr.com/image/yisLBauERBWIFk9SIXh-ig.png)
: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.
Título: Re:Trato de armar una linterna pero me sale mal
Publicado por: Naitsabes0 en Agosto 14, 2017, 11:18:02 AM
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.
(https://image.prntscr.com/image/yisLBauERBWIFk9SIXh-ig.png)
No logre armar la linterna en la forma circular para el personaje.  :(
Título: Re:Trato de armar una linterna pero me sale mal
Publicado por: 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 (https://www.youtube.com/watch?v=dYbCfhX3Hu4)
Video 2: https://www.youtube.com/watch?v=xU6w0oXRoz0&t=726s (https://www.youtube.com/watch?v=xU6w0oXRoz0&t=726s)

Espero te sirvan.
Título: Re:Trato de armar una linterna pero me sale mal
Publicado por: Naitsabes0 en Agosto 15, 2017, 12:26:38 AM
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 (https://www.youtube.com/watch?v=dYbCfhX3Hu4)
Video 2: https://www.youtube.com/watch?v=xU6w0oXRoz0&t=726s (https://www.youtube.com/watch?v=xU6w0oXRoz0&t=726s)

Espero te sirvan.
(https://i.gyazo.com/5cf591ac6b3cbf84038cbfca9130e6fb.gif)
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);
    }
}
Título: Re:Trato de armar una linterna pero me sale mal
Publicado por: Zapdos43 en Agosto 15, 2017, 01:05:50 AM
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);
       
        }