2.7 Method and Sequence Control
2.7.1 Solvent Saver Mode
debe estar rellena (false).
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.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 rotadarot
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 pordestination
.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 pordestination
.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:
•
Nunca debes cambiar el objetivo de dibujo mientras dibujas estás dibujando sobre la pantalla. Es decir, nunca uses las funciones surface_set_target() ni surface_reset_target() en el evento draw. Esto causará graves problemas en la proyección.•
Las superficies no funcionan correctamente en modo 3D. Puedes usarlas mientras no estés en modo 3D (llamando a la función d3d_end() antes de usarlas) pero una vez que empieces a usar el modo 3D de nuevo las superficies se destruirán automáticamente.•
Por motivos de velocidad, las superficies se mantienen en la memoria de video constantemente. Como resultado de esto, podrías perder las superficies al cambiar la resolución de la pantalla o cuando salte el salvapantallas.•
Las superficies no se guardarán al guardar un juego.Tiles
Como ya debes saber, puedes añadir tiles a los cuartos. Una tile es una parte de un fondo. En realidad, una tile es simplemente una imagen visible: no reaccionan ante eventos y no generan colisiones. Como resultado de esto, las tiles funcionan mucho más rápido que los objetos. Así pues, todo lo que no sufra colisiones o no reaccione ante eventos funcionará mucho mejor si lo haces con tiles. Incluso a veces es mejor utilizar un tile para mostrar los gráficos y poner por debajo un objeto invisible que se encargue de las colisiones. Para definir un tile necesitas un fondo. Sobre este fondo indicas la esquina superior (top) izquierda (left), la anchura (width) y la altura (height) de un rectángulo. La parte del fondo que queda dentro de este rectángulo pasa a ser una tile.
Puedes añadir tiles al diseñar el room, pero también puedes hacerlo mientras el juego se ejecuta. Puedes cambiar su posición, escalarlas o hacerlas transparentes. Una tile tiene las propiedades siguientes:
•
background
. El fondo del que se crea la tile.•
left, top, width, height
. La parte del fondo usada en la tile (izquierda, arriba, anchura y altura).•
x,y
. Posición de la esquina superior izquierda del tile en el room.•
depth
. Profundidad del tile. Puedes escoger la profundidad que quieras, haciendo que las tiles aparezcan entre varias instancias distintas.•
visible
. Indica si es visible.•
xscale, yscale
. Factores de escalado horixontal y vertical (el tamaño normal es 1).•
blend
. Color de teñido usado al dibujar el tile.•
alpha
. Factor de transparencia utilizado al dibujar el tile.Para cambiar las propiedades de una tile debes conocer su id. Cuando creas tiles desde el editor de rooms la id se muestra en la barra inferior de información. Pero también existen funciones para conocer la id de una tile en una posición particular.
Las funciones siguientes sirven para manejar tiles:
tile_add(background,left,top,width,height,x,y,depth)
Añade una nueva tile al cuarto con las propiedades indicadas. Esta función devuelve la id de la nueva tile que se puede usar más tarde en el resto de funciones.tile_delete(id)
Elimina el tile con la id especificada.tile_exists(id)
Devuelve si existe una tile con la id especificada.Las funciones siguientes nos dan información sobre las tiles:
tile_get_x(id)
Devuelve la posición x de la tile con la id especificada.tile_get_y(id)
Devuelve la posición y de la tile con la id especificada.tile_get_left(id)
Devuelve el valor de la propiedad left (izquierda) de la tile con la id especificada.tile_get_top(id)
Devuelve el valor de la propiedad top (arriba) de la tile con la id especificada.tile_get_width(id)
Devuelve la anchura de la tile con la id especificada.tile_get_height(id)
Devuelve la altura de la tile con la id especificada.tile_get_depth(id)
Devuelve la profundidad de la tile con la id especificada.tile_get_visible(id)
Devuelve si la tile con la id especificada es visible o no.tile_get_xscale(id)
Devuelve el factor horizontal de escalado de la tile con la id especificada.tile_get_background(id
) Devuelve el fondo de la tile con la id especificada.tile_get_blend(id)
Devuelve el color de teñido de la tile con la id especificada.tile_get_alpha(id)
Devuelve el factor de transparencia de la tile con la id especificada.Las funciones siguientes sirven para manipular las propiedades de las tiles:
tile_set_position(id,x,y
) Coloca la tile con la id especificada en la posición x,y.tile_set_region(id,left,top,width,height)
Cambia la región del tile con la id especificada sobre su fondo.tile_set_background(id,background)
Cambia el fondo de la tile con la id especificada.tile_set_visible(id,visible)
Cambia la visibilidad de la tile con la id especificada.tile_set_depth(id,depth)
Cambia la profundidad de la tile con la id especificada.tile_set_scale(id,xscale,yscale)
Cambia los factores de escala de la tile con la id especificada.tile_set_blend(id,color)
Cambia el color de teñido de la tile con la id especificada. Sólo disponible en la versión registrada!tile_set_alpha(id,alpha)
Cambia la transparencia de la tile con la id especificada.Las funciones siguientes manejan capas de tiles, es decir, grupos de tiles que tienen la misma profundidad:
tile_layer_hide(depth)
Oculta todas las tiles con la profundidad indicada.tile_layer_show(depth)
Muestra todas las tiles con la profundidad indicada.tile_layer_delete(depth)
Elimina todas las tiles con la profundidad indicada..tile_layer_shift(depth,x,y)
Mueve todas las tiles con la profundidad indicada siguiendo el vector (x,y). Esta función se puede usar para capas de tiles móviles.tile_layer_find(depth,x,y)
Devuelve la id de la tile con la profundidad indicada que se encuentra en la posición (x,y). Si no se encuentra ninguna tile la función devuelve -1. Cuando se encuentran varias tiles en esa posición con la misma profundidad se devuelve la primera.tile_layer_delete_at(depth,x,y)
Elimina la tile con la profundidad indicada que se encuentra en la posición (x,y). Si se encentran varias tiles en esa posición y con la profundidad indicada se eliminan todas.tile_layer_depth(depth,newdepth)
Cambia la profundidad de todas las tiles con la profundidad indicada a la nueva profundidad. Es decir, con esta función puedes mover capas enteras de tiles a otra profundidad.El display
El display es todo el área del monitor. Tiene varias características como el tamaño (típicamente 1024x768 ó
1280x1024), la profundidad de color (que es el número de bits que se utilizan para representar 1 píxel) y suele ser de 16 bits (color de alta densidad) ó 32 bits (color verdadero) y la frecuencia de refresco, que es el número de veces por segundo que se refresca el display, es decir, cuántas veces por segundo se vuelven a dibujar los píxeles en la pantalla (típicamente entre 60 y 120). Estos parámetros se pueden cambiar desde las propiedades de la pantalla en Windows. Pero para algunos juegos, sobre todo los que se ejecuten en pantalla completa, es importante poder controlar estos
aspectos. Todos ellos se pueden inicializar desde la pestaña Game Settings. Para cambiar estos parámetros durante el juego Game Maker dispone de un grupo de funciones que veremos a continuación. Debes tener en cuenta que al cambiar estos parámetros el sistema necesitará un poco de tiempo para volver a ajustarlo todo. Las funciones para cambiar el modo sólo están disponibles en la versión registrada de Game Maker.
display_get_width()
Devuelve la anchura del display en píxeles.display_get_height()
Devuelve la altura del display en píxeles.display_get_colordepth()
Devuelve la profundidad de color en bits.display_get_frequency()
Devuelve la frecuencia de refresco del monitor.display_set_size(w,h)
Cambia la altura y anchura del display a los nuevos valores indicados. La función devuelve true si los cambios se aplicaron con éxito y false en caso contrario (Debes tener en cuenta que sólo algunas combinaciones están permitidas, por ejemplo 800x600, 1024x768 ó 1280x1024).display_set_colordepth(coldepth)
Cambia la profundidad de color a la especificada. En general sólo se permite usar profundidad de color de 16 ó 32 bits. La función devuelve true si los cambios se aplicaron con éxito y false en caso contrario.display_set_frequency(frequency)
Cambia la frecuencia de refresco del monitor a la especificada. Sólo unas pocas frecuencias están permitidas. Por ejemplo, puedes ajustar este valor a 60 y usar un room_speed del mismo valor para lograr animaciones fluidas de 60 frames por segundo. La función devuelve true si los cambios se aplicaron con éxito y false en caso contrario.display_set_all(w,h,frequency,coldepth)
Cambia todos los valores a la vez. Para valores que no quieras cambiar utiliza -1. La función devuelve true si los cambios se aplicaron con éxito y false en caso contrario.display_test_all(w,h,frequency,coldepth)
Comprueba si los valores especificados están permitidos. La función no aplica los valores al display, sólo chequea si son válidos. Para los valores que no quieras cambiar usa el valor -1. La función devuelve true si los cambios se pueden aplicar y false en caso contrario.display_reset()
Resetea las características del display a los originales, es decir, a los que estaban presentes cuando se inició el programa.A veces es útil poder conocer la posición del puntero en el display o poder cambiarla. Para ello se usan las funciones siguientes:
display_mouse_get_x()
Devuelve la coordenada x del puntero en el display.display_mouse_get_y()
Devuelve la coordenada x del puntero en el display.display_mouse_set(x,y)
Cambia la posición del puntero a los valores indicados.La ventana
El juego se ejecuta en una ventana. Esta ventana tiene varias propiedades como si tiene borde, si ocupa toda la pantalla...Normalmente estos valores se fijan desde la opción Game Settings. Pero también puedes cambiarlos durante el juego. Para ello puedes usar las funciones siguientes: