Mayo 05, 2017, 03:20:32 AM Ultima modificación: Mayo 07, 2017, 08:40:20 PM por Naitsabes0
Resulta que logre resolver de cierta forma mi problema:

Ejemplo 1
Aquí hay cuadrados rojos pero no se ven. profundidad del cubo = 0 por defecto

Ejemplo 2
Aqui los cuadrados se ven incluso encima de la oscuridad. profundidad del cubo = -10

Mi problema es que no se porque los cubos no se dejan ver cuando la luz los alcanza, por lo que aumente su depth a -1 hasta llegar a -10 (10 intentos fallidos), pero esto solo provoco que los cuadrados se vieran por encima de la oscuridad y la luz.

La idea es que se comporte de la forma típica de los juegos, es decir esto.



Y claro mi código me hace ver todo o nada  :(.

Códigos:

obj_Oscuridad: Sin sprite profundidad 0 por defecto

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.

obj_Personaje: cuadrado verde profundidad -2

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_Rojo: cuadrado rojo profundidad 0 en ejemplo 1 y -10 en ejemplo 2.

Sin codigo

#1 Mayo 05, 2017, 06:29:09 AM Ultima modificación: Mayo 05, 2017, 06:31:28 AM por DeeY
Cambia bm_add a bm_subtract

Y añade esto debajo de draw_set_blend_mode(bm_add);

draw_clear(c_white);

EDITO: Adjunto un ejemplo de luces del cual hice un port para Game Maker: Studio

#2 Mayo 05, 2017, 07:11:24 PM Ultima modificación: Mayo 05, 2017, 07:18:09 PM por Naitsabes0
Cita de: DeeY en Mayo 05, 2017, 06:29:09 AM
Cambia bm_add a bm_subtract

Y añade esto debajo de draw_set_blend_mode(bm_add);

draw_clear(c_white);

EDITO: Adjunto un ejemplo de luces del cual hice un port para Game Maker: Studio

Asi es como se ve en los 2 ejemplos.

Ejemplo 1


Ejemplo 2


Así quedaron los códigos:

obj_Oscuridad: Sin sprite profundidad 0 por defecto

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.

obj_Personaje: cuadrado verde profundidad -2

DRAW:
///Creacion de la linterna
//para la apariencia de la linterna
//draw_set_blend_mode(bm_add)
draw_set_blend_mode(bm_subtract)
draw_clear(c_white)
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_Rojo: cuadrado rojo profundidad 0 en ejemplo 1 y -10 en ejemplo 2.

Sin codigo

Solo se invirtieron los colores (tonalidades), el problema todavía persiste, incluso queda peor que antes  :-\.


Cita de: DeeY en Mayo 05, 2017, 11:38:46 PM
Vuelve a dejar bm_add

Con ese consejo queda así



Con cada cambio que me dice que aga se veo peor que la original ¿seguro que sabe como hacer o solucionar este problema? parece mas complicado de lo que pensaba  :(.

Intenta con el codigo cambiado de esta forma:

obj_Oscuridad -  Sin sprite profundidad -1
[gml]
///Draw Event

///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.

///Creación 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)
[/gml]

obj_Personaje - cuadrado verde profundidad 0.
[gml]
//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)
[/gml]

obj_Rojo - cuadrado rojo profundidad 0.

si quieres crear un sistema de iluminacion, ocupa 'surfaces' ~~

Cita de: Alesxanderk en Mayo 06, 2017, 01:16:37 AM
Intenta con el codigo cambiado de esta forma:

obj_Oscuridad -  Sin sprite profundidad -1
[gml]
///Draw Event

///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.

///Creación 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)
[/gml]

obj_Personaje - cuadrado verde profundidad 0.
[gml]
//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)
[/gml]

obj_Rojo - cuadrado rojo profundidad 0.

Su código provoca el siguiente efecto.



No se que pasa, pero veo que su código destruye al jugador y a los cuadrados rojos, ni el propio jugador puede moverse con este nuevo código ¿seguro/a que su respuesta es para  :GMS:? porque no funciona  :-\.

#8 Mayo 06, 2017, 04:49:06 AM Ultima modificación: Mayo 06, 2017, 04:51:00 AM por Naitsabes0
Cita de: wilodxd en Mayo 06, 2017, 03:13:26 AM
si quieres crear un sistema de iluminacion, ocupa 'surfaces' ~~

Las habría ocupado antes de hacer este post si supiera como crearlas bien para el juego que hago, pero como no logre armarlo bien, empece con este código, ademas los ejemplos hispanos son de  :GM8: y unos pocos ingleses de  :GMS:. 

Cita de: Naitsabes0 en Mayo 06, 2017, 04:49:06 AM
Cita de: wilodxd en Mayo 06, 2017, 03:13:26 AM
si quieres crear un sistema de iluminacion, ocupa 'surfaces' ~~

Las habría ocupado antes de hacer este post si supiera como crearlas bien para el juego que hago, pero como no logre armarlo bien, empece con este código, ademas los ejemplos hispanos son de  :GM8: y unos pocos ingleses de  :GMS:. 

comienza creando una 'surface'
-en el event create del 'obj_oscuridad'-
"
globalvar surf;
surf = surface_create(view_wview,view_hview);
"

bien esto es para tener una 'plana' para dibujar
ahora dibujaremos en ella
-en el evento step del 'obj_oscuridad'-
"
surface_set_target(surf);
draw_set_color(c_black);
draw_rectangle(0,0,view_wview,view_hview);
surface_reset();
"
bien ya tenemos la plana de color negro ahora hay que borrar o hacer nuestras luces
-en el objeto que iluminara en el evento step-
"
surface_set_target(surf);
draw_set_blend_mode(bm_subtract);
//aqui puede poner el sprite de alguna 'luz'
draw_circle(x-view_xview,y-view_yview,32,0);
surface_reset_target();
"
finalmente dibujamos la surfaces en pantalla
-en el 'obj_oscuridad' en el evento draw-
"
if(surface_exists(surf)){
    draw_surface(surf,view_xview,view_yview);
}else{
    surf = surface_create(view_wview,view_hview);
}
"
bien pruebalo,no lo he probado pero deberia funcionar.

Cita de: wilodxd en Mayo 06, 2017, 06:07:43 PM
Cita de: Naitsabes0 en Mayo 06, 2017, 04:49:06 AM
Cita de: wilodxd en Mayo 06, 2017, 03:13:26 AM
si quieres crear un sistema de iluminacion, ocupa 'surfaces' ~~

Las habría ocupado antes de hacer este post si supiera como crearlas bien para el juego que hago, pero como no logre armarlo bien, empece con este código, ademas los ejemplos hispanos son de  :GM8: y unos pocos ingleses de  :GMS:. 

comienza creando una 'surface'
-en el event create del 'obj_oscuridad'-
"
globalvar surf;
surf = surface_create(view_wview,view_hview);
"

bien esto es para tener una 'plana' para dibujar
ahora dibujaremos en ella
-en el evento step del 'obj_oscuridad'-
"
surface_set_target(surf);
draw_set_color(c_black);
draw_rectangle(0,0,view_wview,view_hview);
surface_reset();
"
bien ya tenemos la plana de color negro ahora hay que borrar o hacer nuestras luces
-en el objeto que iluminara en el evento step-
"
surface_set_target(surf);
draw_set_blend_mode(bm_subtract);
//aqui puede poner el sprite de alguna 'luz'
draw_circle(x-view_xview,y-view_yview,32,0);
surface_reset_target();
"
finalmente dibujamos la surfaces en pantalla
-en el 'obj_oscuridad' en el evento draw-
"
if(surface_exists(surf)){
    draw_surface(surf,view_xview,view_yview);
}else{
    surf = surface_create(view_wview,view_hview);
}
"
bien pruebalo,no lo he probado pero deberia funcionar.
Esta mal escrito



Ademas tiene lineas rojas



Se agradece la intención  :), pero este quedo peor que todos los anteriores mencionados, ya que ni siquiera se puede abrir el juego  :(, no es por ser cómodo pero ¿no cree que debería comprobar si la información enviada funciona?

#11 Mayo 06, 2017, 10:48:03 PM Ultima modificación: Mayo 06, 2017, 10:54:35 PM por wilodxd
~~ ehm cambia eso por 'surface_reset_target(surf)' hay varios otros escritos...
y en draw rectangle es asi 'draw_rectangle(0,0,view_wview,view_hview,0);'
pff vamos pequeños detalles :P
e intenta entender el codigo , la idea es aprender como funciona no hacer copy/paste.

Cita de: wilodxd en Mayo 06, 2017, 10:48:03 PM
~~ ehm cambia eso por 'surface_reset_target(surf)' hay varios otros escritos...
y en draw rectangle es asi 'draw_rectangle(0,0,view_wview,view_hview,0);'
pff vamos pequeños detalles :P
e intenta entender el codigo , la idea es aprender como funciona no hacer copy/paste.

Vale estudie este código y lo deje así:

obj_Oscuridad
CREATE:
///Plana para dibujar
globalvar surf;
surf = surface_create(view_wview,view_hview);

STEP
///Oscuridad
//Plana de color negro
surface_set_target(surf);
draw_set_color(c_black);
draw_rectangle(0,0,view_wview,view_hview,0);
surface_reset_target();

//Objeto que ilumina
surface_set_target(surf);
draw_set_blend_mode(bm_subtract);
//aqui puede poner el sprite de alguna 'luz'
draw_sprite_ext(spr_Luz,0,x,y,5,5,45,c_white,0.2)
draw_circle(x-view_xview,y-view_yview,32,0);
surface_reset_target();

DRAW
///Dibuja la surface
if(surface_exists(surf)){
    draw_surface(surf,view_xview,view_yview);
}else{
    surf = surface_create(view_wview,view_hview);
}

obj_Personaje
DRAW
//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)

Resultado: ¿Colores invertidos  :o? no es lo que estoy buscando, pero se ve interesante  :).


Sin embargo se veo muy lejos a lo que estoy buscando desde que empece este post  :(.

#13 Mayo 07, 2017, 12:23:50 AM Ultima modificación: Mayo 07, 2017, 12:48:03 AM por KiryuAri
Hola.
Este codigo podria ayudarte.
1:tu decides su Depth: desde el objeto
2:este codigo lo puedes implementar en un objeto nuevo.

en evento create:
xscale = 1; yscale = 1;
alpha0=1;
c0= make_colour_rgb(255,255,255);

-En evento draw
draw_set_blend_mode(bm_subtract);
x0=mouse_x; y0=mouse_y;
x1=sprite_get_height(Spr_01)/2;
y1=sprite_get_width(Spr_01)/2;
draw_sprite_ext(Spr_01,0,x0,y0,xscale,yscale,0,c_white,alpha0);//tu sprite foco (blanco=100% opaco||negro=0% opaco)
//Sombra izquierda
draw_primitive_begin(pr_trianglefan);
draw_vertex_colour(-1,-1,c0,alpha0)
draw_vertex_colour(x0-x1,-1,c0,alpha0)
draw_vertex_colour(x0-x1,room_height+1,c0,alpha0)
draw_vertex_colour(-1,room_height+1,c0,alpha0)
draw_primitive_end()
///Sombra derecha
draw_primitive_begin(pr_trianglefan);
draw_vertex_colour(room_width+1,-1,c0,alpha0)
draw_vertex_colour(x0+x1,-1,c0,alpha0)
draw_vertex_colour(x0+x1,room_height+1,c0,alpha0)
draw_vertex_colour(room_width+1,room_height+1,c0,alpha0)
draw_primitive_end()
///Sombra Arriba
draw_primitive_begin(pr_trianglefan);
draw_vertex_colour(x0-x1,-1,c0,alpha0)
draw_vertex_colour(x0+x1,-1,c0,alpha0)
draw_vertex_colour(x0+x1,y0-y1,c0,alpha0)
draw_vertex_colour(x0-x1,y0-y1,c0,alpha0)
draw_primitive_end()
///Sombra Arriba
draw_primitive_begin(pr_trianglefan);
draw_vertex_colour(x0-x1,room_width+1,c0,alpha0)
draw_vertex_colour(x0+x1,room_width+1,c0,alpha0)
draw_vertex_colour(x0+x1,y0+y1,c0,alpha0)
draw_vertex_colour(x0-x1,y0+y1,c0,alpha0)
draw_primitive_end()
draw_set_blend_mode(bm_normal);

Espero te sirva, buena suerte!
Projectos en desarrollo.

Cita de: Naitsabes0 en Mayo 07, 2017, 12:06:44 AM
Cita de: wilodxd en Mayo 06, 2017, 10:48:03 PM
~~ ehm cambia eso por 'surface_reset_target(surf)' hay varios otros escritos...
y en draw rectangle es asi 'draw_rectangle(0,0,view_wview,view_hview,0);'
pff vamos pequeños detalles :P
e intenta entender el codigo , la idea es aprender como funciona no hacer copy/paste.

Vale estudie este código y lo deje así:

obj_Oscuridad
CREATE:
///Plana para dibujar
globalvar surf;
surf = surface_create(view_wview,view_hview);

STEP
///Oscuridad
//Plana de color negro
surface_set_target(surf);
draw_set_color(c_black);
draw_rectangle(0,0,view_wview,view_hview,0);
surface_reset_target();

//Objeto que ilumina
surface_set_target(surf);
draw_set_blend_mode(bm_subtract);
//aqui puede poner el sprite de alguna 'luz'
draw_sprite_ext(spr_Luz,0,x,y,5,5,45,c_white,0.2)
draw_circle(x-view_xview,y-view_yview,32,0);
surface_reset_target();

DRAW
///Dibuja la surface
if(surface_exists(surf)){
    draw_surface(surf,view_xview,view_yview);
}else{
    surf = surface_create(view_wview,view_hview);
}

obj_Personaje
DRAW
//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)

Resultado: ¿Colores invertidos  :o? no es lo que estoy buscando, pero se ve interesante  :).


Sin embargo se veo muy lejos a lo que estoy buscando desde que empece este post  :(.


jaajjajaja ops ~~
aqui
"

//Objeto que ilumina
surface_set_target(surf);
draw_set_blend_mode(bm_subtract);
//aqui puede poner el sprite de alguna 'luz'
draw_sprite_ext(spr_Luz,0,x,y,5,5,45,c_white,0.2)
draw_circle(x-view_xview,y-view_yview,32,0);
draw_set_blend_mode(bm_normal);///esta linea ~~ debes restablecer el 'blend'
surface_reset_target();

"