Septiembre 01, 2017, 03:30:16 PM Ultima modificación: Septiembre 03, 2017, 11:09:24 PM por Johann
En un inicio la solución es mas fácil, y muchos me dirán que simplemente le de a invertir en la opción de colores del sprite, pero busco algo mas complejo de hacer, y es que quiero crear un objeto que todo lo que este en una habitación (room), invierta sus colores, la razón de esto es que quiero que el cuarto tenga una apariencia única que no se va a encontrar en ningún otro lado, digamos que es una zona secreta opcional que el jugador puede visitar por curiosidad.

Un ejemplo de como se vería una imagen en todo el juego (izquierda), y otra en como se vera en esa habitación secreta (derecha).

Gracias por leer.


Cita de: Clamud en Septiembre 01, 2017, 03:52:58 PM
Puedes usar un script: http://www.gmlscripts.com/script/draw_rectangle_inverted
O un shader: http://xorshaders.weebly.com/tutorials/color-shaders-3
EL scrip
No funciona, me da error.
{
    draw_set_blend_mode_ext(bm_inv_dest_color,bm_inv_src_color);
    draw_rectangle_color(argument0,argument1,argument2,argument3,c_white,c_white,c_white,c_white,0);
    draw_set_blend_mode(bm_normal);
    return 0;
}

El shaders es algo que nunca he visto, pero al seguir los pasos de la pagina http://xorshaders.weebly.com/tutorials/color-shaders-3 , tampoco funciona en  :GMS:.

¿Seguro que no hay un método tan simple, como programar un objeto que invierta todo lo que esta en la habitación o la vista? estos códigos que mezclan scripts y shaders parecen poco prácticos para un fin tan simple como invertir colores.

A mi me funciona el script, el problema es que se dibuja tambien el rectangulo. Me puse a buscar y encontre la solucion:
[gml]
draw_set_blend_mode_ext(bm_inv_dest_colour, bm_zero);
draw_rectangle_colour(x, y, x+sprite_width, y+sprite_height, c_white,c_white,c_white,c_white,false);
draw_set_blend_mode(bm_normal);
draw_self();
draw_set_blend_mode_ext(bm_inv_dest_colour, bm_zero);
draw_rectangle_colour(x, y, x+sprite_width, y+sprite_height, c_white,c_white,c_white,c_white,false);
draw_set_blend_mode(bm_normal);
[/gml]

Cita de: 3dgeminis en Septiembre 01, 2017, 11:53:16 PM
A mi me funciona el script, el problema es que se dibuja tambien el rectangulo. Me puse a buscar y encontre la solucion:
[gml]
draw_set_blend_mode_ext(bm_inv_dest_colour, bm_zero);
draw_rectangle_colour(x, y, x+sprite_width, y+sprite_height, c_white,c_white,c_white,c_white,false);
draw_set_blend_mode(bm_normal);
draw_self();
draw_set_blend_mode_ext(bm_inv_dest_colour, bm_zero);
draw_rectangle_colour(x, y, x+sprite_width, y+sprite_height, c_white,c_white,c_white,c_white,false);
draw_set_blend_mode(bm_normal);
[/gml]

Se agradece el apoyo, pero solo invirtió el sprite de un objeto, para ser mas preciso el sprite que contiene el objeto, como ya mencione busco que el objeto invierta el color de todos los objetos que están en la habitación o la vista del jugador, este código no sirve para dicha acción, incluso se puede lograr lo mismo sin escribir nada de código, dándole a la opción de invertir cuando el jugador esta creando un sprite.

Detalle a considerar.

He escrito este código en un evento "draw" a un objeto que debe ser invisible (sin sprite), ya que es un controlador, pero sale error si este no tiene sprite, ademas este código no invierte nada a pesar de que esta presente, ni en la habitación, vista o colisión contra el.


NOTA: El cuadrado rojo es el sprite que estuve obligado a colocar para que me dejara abrir el juego, pero es de color celeste (producto del código), y no hace absolutamente nada al entorno.

prueba poniendo ese código dentro de un bloque de este estilo en un objeto controlador

[gml]
with (all) {
    //codigo de 3dgeminis
}
[/gml]
Cita de: Fenris78Si un tema os resulta de interes y veis que hay poca información, la mejor solucion no es quejarse o pedir sin pensar, sino sugerir algo bien planteado o aportarlo vosotros mismos.
Cita de: CalioSomos desarrolladores independientes y, por lo tanto, no tenemos por qué guiarnos por las tendencias del mercado.

A mi me funciona, como se ve en las imágenes adjuntas.
Para que afecte a toda la ventana, debes poner como argumentos del script los límites de la view o de la room, y el script se debe ejecutar después de que los objetos se han dibujado (el objeto controlador debe tener menor depth que los demás o usar el evento Draw End). Si quieres que el personaje no resulte afectado debes dibujarlo después de ejecutar el script.

Cita de: Johann en Septiembre 02, 2017, 05:18:54 PM
prueba poniendo ese código dentro de un bloque de este estilo en un objeto controlador

[gml]
with (all) {
    //codigo de 3dgeminis
}
[/gml]
obj_Invertir_Colores
evento "DRAW"
///Invertir colores
with (all)
{
draw_set_blend_mode_ext(bm_inv_dest_colour, bm_zero);
draw_rectangle_colour(x, y, x+sprite_width, y+sprite_height, c_white,c_white,c_white,c_white,false);
draw_set_blend_mode(bm_normal);
draw_self();
draw_set_blend_mode_ext(bm_inv_dest_colour, bm_zero);
draw_rectangle_colour(x, y, x+sprite_width, y+sprite_height, c_white,c_white,c_white,c_white,false);
draw_set_blend_mode(bm_normal);
}

Resultado final.

ERROR in
action number 1
of Draw Event
for object obj_Invertir_Colores:

Trying to draw non-existing sprite.
at gml_Object_obj_Invertir_Colores_DrawEvent_1 (line 7) - draw_self();

Esta malo, probablemente porque no tengo ningún scrip en este experimento.

Cita de: Clamud en Septiembre 02, 2017, 06:01:48 PM
A mi me funciona, como se ve en las imágenes adjuntas.
Para que afecte a toda la ventana, debes poner como argumentos del script los límites de la view o de la room, y el script se debe ejecutar después de que los objetos se han dibujado (el objeto controlador debe tener menor depth que los demás o usar el evento Draw End). Si quieres que el personaje no resulte afectado debes dibujarlo después de ejecutar el script.
obj_Invertir_Colores
evento "DRAW"
///Invertir colores
with (all)
{
draw_set_blend_mode_ext(bm_inv_dest_colour, bm_zero);
draw_rectangle_colour(x, y, x+sprite_width, y+sprite_height, c_white,c_white,c_white,c_white,false);
draw_set_blend_mode(bm_normal);
draw_self();
draw_set_blend_mode_ext(bm_inv_dest_colour, bm_zero);
draw_rectangle_colour(x, y, x+sprite_width, y+sprite_height, c_white,c_white,c_white,c_white,false);
draw_set_blend_mode(bm_normal);
}

Resultado final.

ERROR in
action number 1
of Draw Event
for object obj_Invertir_Colores:

Trying to draw non-existing sprite.
at gml_Object_obj_Invertir_Colores_DrawEvent_1 (line 7) - draw_self();

Esta malo, probablemente porque no tengo ningún scrip en este experimento, tampoco sabría como conectarlo con el obj_Invertir_Colores si lo creara  :-\.