Esta funcionalidad sólo está disponible en la versión registrada de Game Maker
En algunas situaciones puede que no quieras dibujar directamente en la pantalla sino en un lienzo que más tarde puedas usar para dibujar otras cosas. Por ejemplo, puedes querer que el usuario dibuje en la pantalla. En vez de dejar que el usuario dibuje directamente en la pantalla (lo que no funcionaría, ya que la pantalla se refresca en cada step) puedes hacer que dibuje en un lienzo a parte y copiar este lienzo a la pantalla en cada paso. También podrías querer usar una textura que cambie con el tiempo, crear un efecto de transiciones entre cuartos, efectos de iluminación…
Las superficies hacen posibles cosas como éstas. Las superficies son muy sencillas de usar: primero creas una superficie indicando su tamaño. Luego indicas que vas a dibujar sobre la superficie. Desde este momento, todas las funciones de dibujo se aplicarán a la superficie. Cuando termines de dibujar, indicas que ya no vas a dibujar más en la superficie. Ya tienes lista la superficie, ahora puedes dibujarla directamente en la pantalla, usarla como textura…Consulta el final del capítulo para conocer algunos detalles con los que debes tener cuidado al trabajar con superficies.
Las siguientes funciones sirven para tratar superficies:
surface_create(w,h)
Crea una superficie con la anchura y altura indicadas. La función devuelve la id
de la superficie que debe ser usada en las demás funciones. Observa que la
superficie no se “limpia” (es decir, que no se pinta toda ella de un mismo
color). Para esto, debes indicar que vas a dibujar en la superficie y llamar a
la función apropiada, por ejemplo draw_clear(color).
surface_free(id)
Libera la memoria utilizada por la superficie.
surface_exists(id)
Devuelve si la superficie con la id especificada existe.
Estas funciones nos dan información sobre la superficie:
surface_get_width(id)
Devuelve la anchura de la superficie.
surface_get_height(id)
Devuelve la altura de la superficie.
surface_get_texture(id)
Devuelve la textura correspondiente a la superficie. Esto se puede usar para
dibujar objetos texturizados con la imagen de la superficie.
Estas dos funciones manejan el mecanismo de dibujo:
surface_set_target(id)
Indica que la superficie con la id correspondiente es el objetivo de dibujo.
Esto significa que todas las funciones de dibujo que se llamen actuarán sobre la
superficie. Simplemente resetea la proyección para que cubra sólo a la
superficie.
surface_reset_target()
Vuelve a fijar la pantalla como objetivo de dibujo. Es decir, las funciones de
dibujo que se llamen a partir de ahora funcionarán normalmente ¡No olvides
llamar a esta función cuando termines de dibujar sobre la superficie!
Las funciones siguientes nos permiten manejar las superficies:
surface_getpixel(id,x,y)
Devuelve el color del píxel en la posición (x,y) de la superficie. Esta función
no es muy rápida así que úsala con moderación.
surface_save(id,fname)
Guarda una imagen bmp de la superficie, creando para ello el archivo con el
nombre indicado. Se puede usar para crear screenshots, por ejemplo.
surface_save_part(id,fname,x,y,w,h)
Igual que la función anterior, pero esta vez sólo se copiará la parte de la
superficie que indiques.
Para dibujar superficies hay muchas posibilidades:
draw_surface(id,x,y)
Dibuja la superficie en la posición (x,y).
draw_surface_stretched(id,x,y,w,h)
Dibuja la superficie en la posición (x,y) y escalada de forma que tenga la
anchura y altura indicadas.
draw_surface_tiled(id,x,y)
Dibuja la superficie en la posición (x,y) y la repite una y otra vez para que
ocupe todo el cuarto.
draw_surface_part(id,left,top,width,height,x,y)
Dibuja la parte indicada de la superficie en la posición (x,y).
draw_surface_ext(id,x,y,xscale,yscale,rot,color,alpha)
Dibuja la superficie en la posición (x,y), con factores de escala, rotación,
transparencia y tiñiéndola con el color indicado (utiliza c_white si no
quieres teñir la superficie).
draw_surface_stretched_ext(id,x,y,w,h,color,alpha)
Dibuja la superficie en la posición (x,y) escalada para que ocupe la región
indicada con factor de transparencia y tiñiéndola del color especificado.
draw_surface_tiled_ext(id,x,y,xscale,yscale,color,alpha)
Dibuja la superficie repitiéndola para que ocupe todo el cuarto pero con
factores de escala, transparencia y tiñiéndola del color indicado.
draw_surface_part_ext(id,left,top,width,height,x,y,xscale,yscale,color,alpha)
Dibuja la parte indicada de la superficie en la posición (x,y) pero con factores
de escala, transparencia y color.
draw_surface_general(id,left,top,width,height,x,y,xscale,yscale,rot,c1,c2,c3,c4,alpha)
La función más general de dibujo. Dibuja la parte indicada de la superficie con
su origen en la posición (x,y), con factores de escala, transparencia y rotada
rot
grados en sentido antihorario. Además debes indicar 4 colores para cada una de
las esquinas de la superficie en este orden: esquina superior izquierda, esquina
superior derecha, esquina inferior derecha y esquina inferior izquierda.
Por último, existen dos funciones para copiar superficies:
surface_copy(destination,x,y,source)
Copia la superfcie en la posición (x,y) en la superficie indicada por
destination.
surface_copy_part(destination,x,y,source,xs,ys,ws,hs)
Copia la parte indicada de la superfcie en la posición (x,y) en la superficie
indicada por
destination.
Observa que no hay funciones para copiar parte de la pantalla a una superficie. Esto es imposible debido a la diferencia de formato entre la pantalla y las superficies. Si necesitaras usar esto puedes indicar la superficie como objetivo de dibujo y dibujar todo el room. Luego usando las funciones para copiar superficies puedes copiar partes de ella a la pantalla.
También puedes crear sprites y fondos de superficies. Esto se explica con más detalle en la sección de modificación de recursos.
Al usar superficies debes tener algunas cosas en cuenta: