• No results found

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 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:

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:

window_set_visible(visible)

Hace que la ventana se vuelva visible o invisible. Normalmente la ventana es visible durante todo el juego. Cuando la ventana sea invisible el programa no ejecutará ni recibirá los eventos del teclado.

window_get_visible()

Devuelve si la ventana es visible.

window_set_fullscreen(full)

Hace que la ventana ocupe toda la pantalla (modo pantalla completa) o no.

window_get_fullscreen()

Devuelve si la ventana ocupa toda la pantalla.

window_set_showborder(show)

Indica si el borde alrededor de la ventana debe mostrarse (si la ventana está a pantalla completa el borde no se muestra).

window_get_showborder()

Devuelve si el borde de la ventana es visible cuando ésta no está a pantalla completa.

window_set_showicons(show)

Indica si deben mostrarse los iconos de la ventana (minimizar, maximizar y cerrar). Si la ventana está a pantalla completa no se muestran.

window_get_showicons()

Devuelve si los iconos de la ventana son visibles.

window_set_stayontop(stay)

Indica si la ventana de be mostrarse siempre por encima de otras ventanas que puedan existir.

window_get_stayontop()

Devuelve si la ventana se mantiene siempre por encima de las demás.

window_set_sizeable(sizeable)

Indica si el jugador puede cambiar el tamaño de la ventana. El jugador sólo podrá hacer esto si el borde de la ventana es visible y la ventana no está a pantalla completa.

window_get_sizeable()

Devuelve si el jugador puede cambiar el tamaño de la ventana.

window_set_caption(caption)

Indica el título de la ventana. Normalmente esto se especifica al definir el room y se cambia usando la variable room_caption. Por ello, esta función no es útil a no ser que dibujes tú mismo el room en lugar de dejar que Game Maker lo haga automáticamente. El título de la ventana sólo es visible cuando ésta tiene borde visible y no está a pantalla completa.

window_get_caption()

Devuelve el título de la ventana.

window_set_cursor(curs)

Indica el puntero que se usará en la ventana. Puedes indicar una de las siguientes constantes:

cr_default

cr_none

cr_arrow

cr_cross

cr_beam

cr_size_nesw

cr_size_ns

cr_size_nwse

cr_size_we

cr_uparrow

cr_hourglass

cr_drag

cr_nodrop

cr_hsplit

cr_vsplit

cr_multidrag

cr_sqlwait

cr_no

cr_appstart

Related documents