Iluminación Básica
En esta ocasión aprenderemos a crear un simple sistema de iluminación mediante la utilización de surfaces. El tutorial será realizado con la versión GMS 1.4+, pero funciona con cualquier versión a partir de Game Maker Pro 8.1, no funciona en la versión lite y no ha sido probado en versiones más antiguas de Game Maker, pero puede funcionar igualmente.
Recursos Nescesarios
Para éste tutorial necesitarás dos imágenes, una que sirva de fondo o "background" y otra imagen que servirá de referencia para ubicar las luces, en el tutorial se utilizarán los siguientes, puedes descargarlas haciendo click derecho sobre ellas y a continuación en "Guardar imagen como...", o puedes utilizar imágenes propias. O puede optar por descargar los archivos originales y de mayor calidad junto con el archivo ".gmz" del proyecto.
La contraseña para descomprimir el ".rar" es "http://desarrollocreativo.weebly.com/"
|
|
Nota
Los nombres de los recursos son colocados entre comillas, y no es necesario utilizar los mismos siempre y cuando lo tengan en consideración a la hora de escribir el código.
Tutorial
Para comenzar primero crearemos un nuevo proyecto, dentro del mismo crearemos un sprite "spr_luz" al cuál centraremos el origen, y un background "back_pueblo".
Una vez hecho esto crearemos dos objetos, uno que servirá de ambiente y lienzo al que llamaremos "obj_surface", y otro que utilizaremos para iluminar "obj_luz".
Dentro del "obj_surface" añadiremos un evento Create, y en él, un bloque de código con la siguiente escritura:
/////Create
global.luz = surface_create(view_wview,view_hview);
Ésto lo que hará será crear una una superficie almacenada en una variable global "luz", sobre la cual luego se dibujarán los elementos que indiquemos.
A continuación añadiremos un evento Step, y en él, un bloque de código con la siguiente escritura:
/////Step
surface_set_target(global.luz);
draw_set_color(c_ltgray);
draw_rectangle(0,0,view_wview,view_hview,false);
surface_reset_target();
Éste código establecerá la surface sobre la cuál actuaremos, se establece un color de dibujo ("c_ltgray", gris claro) y luego se dibuja un rectángulo en la posición 0,0 (x,y) del ancho y alto de la view o cámara del juego (view_wview,view_hview) y al final un "false" que indica que debe estar relleno de color, en caso de colocar "true" únicamente dibujaría el borde del mismo.
La acción "surface_reset_target();" resetea la superficie para volver a dibujarla en el próximo "Step"
La acción "surface_reset_target();" resetea la superficie para volver a dibujarla en el próximo "Step"
Nuevamente añadiremos otro evento, en este caso uno de Draw con el siguiente código:
/////Draw
draw_set_blend_mode(bm_subtract);
draw_surface(global.luz,view_xview,view_yview);
draw_set_blend_mode(bm_normal);
La función "draw_set_blend_mode()" es un poco compleja de explicar, pero básicamente establece el modo en el que se dibujrán los pixeles, luego de esto se dibuja la superficie y para finalizar se vuelve a la normalidad el modo de dibujo.
Para finalizar nos dirigimos al "obj_luz", le asignamos el sprite del foco y en él agregamos un evento Step End con el siguiente código:
/////End Step
size= 128;
color=c_white
draw_set_blend_mode(bm_subtract);
surface_set_target(global.luz);
draw_ellipse_color(x-size/2-view_xview,y-size/2-view_yview,x+size/2-view_xview,y+size/2-view_yview,color,c_black,false);
surface_reset_target();
draw_set_blend_mode(bm_normal);
De ésta forma establecemos el tamaño de la luz (128) y el color de la misma, como anteriormente lo hicimos, modificamos el modo de dibujo antes de añadir un elipse la surface que creamos el objeto "obj_surface".
Ya hemos terminado, pero si deseamos evitar que la imagen de la bombilla sea visible durante el juego simplemente debemos añadir el siguiente código en el evento Create del "obj_luz", el cual eliminará el sprite.
Ya hemos terminado, pero si deseamos evitar que la imagen de la bombilla sea visible durante el juego simplemente debemos añadir el siguiente código en el evento Create del "obj_luz", el cual eliminará el sprite.
/////Create
sprite_index = noone
Preparando el Room
Lo siguiente es colocar todo ésto en un nuevo Room.
Crea uno y ponle el background, el "obj_surface" en alguna parte(solo hace falta uno) y agrega todos los "obj_luz" dónde quieras y ya está todo listo.
Crea uno y ponle el background, el "obj_surface" en alguna parte(solo hace falta uno) y agrega todos los "obj_luz" dónde quieras y ya está todo listo.
Felicitaciones
Si ha llegado hasta aquí debería tener lista la iluminación, felicitaciones.
Anímese
Anímese a modificar los colores y el tamaño, tal vez se lleve algunas sorpresas, que el blanco es negro y el negro es blanco? que el naranja es azul? Ésto se debe al modo de dibujo que establecimos al dibujar el rectángulo. ¿Y entonces porqué la luz si respeta el color? Bueno compañero, tampoco lo sé todo yo.