141 13: C O N T R O L D E O B J E T O S En esta seccion veras como se controlan los diferentes objetos generados por los comandos de bobs y sprites, dentro de un progra ma Basic escrito con AMOS. Los topicos de este tema son la detec cion de colisiones, utilizacion del cursor del raton y lectura del joystick. El puntero del raton ==================== El cursor del raton ofrece al programador una valida alterna- tiva al joystick. Con el comando CHANGE MOUSE podras reemplazar la imagen del raton con otra proveniente del banco de sprites. Existe tambien un grupo de instrucciones que te permiten determi- nar la posicion y el status del raton en cualquier momento. Entre esas se incluyen: X MOUSE, Y MOUSE y MOUSE KEY. HIDE (Anula el puntero del raton de la pantalla) HIDE ¡ON¿ Este comando anula por completo de la pantalla el puntero del ra- ton. El sistema realiza un contaje del numero de ocasiones en que has llamado a esta funcion. Esto se consigue averiguando el nume- ro de instrucciones SHOW necesarias antes de que el puntero regre se a la pantalla. Otra version de esta instruccion puede ser utilizada mediante el comando HIDE ON. Este ignora ese contaje que antes mencionaba- mos y siempre anula el puntero, no importara cuantas veces hayas llamado al comando SHOW. Recuerda que HIDE solo transforma en invisible el puntero del raton. No tiene efecto sobre otros comandos AMOS, asi que podras usar perfectamente las funciones X e Y MOUSE para leer las coorde nadas del puntero. SHOW (Activa el puntero del raton) SHOW ¡ON¿ Devuelve a pantalla el puntero del raton despues de una instruc- cion HIDE. Funciona de igual forma a la anterior. 142 CHANGE MOUSE (Cambia el aspecto del puntero del raton) CHANGE MOUSE M Este comando te permite cambiar el aspecto del puntero del raton en cualquier momento. Existen 3 modelos estandard que se asignan con los numeros 1-3. Si especificas un valor superior a 3, se supondra que te refie res a una imagen almacenada en el banco de sprites. El numero de esta imagen se determina usando la expresion: IMAGEN = M - 3. Asi la imagen numero 1 debera instalarse con el valor 4. Al objeto de usar esta opcion, tu imagen de sprite debera ser exactamente de 16 pixels de anchura y no tener mas de 4 colores, mientras que no existe limite para la altura de la misma. = MOUSE KEY (lee el status de los botones del raton) K = MOUSE KEY Te capacita para rapidamente chequear si una o mas teclas del ra- ton han sido pulsadas. El resultado viene en un modelo-BIT que contiene el actual status del raton: BIT 0 Se pone a 1 si el boton izquierdo ha sido pulsado BIT 1 Se pone a 1 si el boton derecho ha sido pulsado BIT 2 Se pone a 1 si el boton central ha sido pulsado (si estuviera presente en tu raton = MOUSE CLICK (chequea si se ha pulsado un boton) C = MOUSE CLICK Chequea si el usuario ha pulsado un boton del raton. Usa el mismo modelo-BIT que el comando anterior. Se pondra a 1 solo cuando un boton sea pulsado. Esos bits se resetean automaticamente a 0 des- pues de que se haya verificado esta funcion. De este modo, solo es capaz de chequear una sola tecla y en una sola ocasion. = X MOUSE = (da/establece la coordenada X del puntero) X1=X MOUSE Este comando devuelve la coordenada X del puntero del raton en coordenadas hardware. Podras usar tambien esta funcion para mover el raton a una determinada posicion de pantalla. Esto se puede lograr asignando X MOUSE con un valor, como si fuera una variable Basic, por ejemplo: X MOUSE= 150 = Y MOUSE = (da/establece la coordenada Y del puntero) Y1= Y MOUSE Similar a la anterior 143 LIMIT MOUSE (limita el raton a una seccion de pantalla) LIMIT MOUSE x1,y1 to x2,y2 Restringe el movimiento del raton al area rectangular definida por las coordenadas hardware (x1,y1 to x2,y2). Observa como a di- ferencia de LIMIT BOB, el raton esta completamente atrapado en esta zona y no puede ser movido fuera de ella. Simplemente podras usar esta instruccion sin parametros para reubicar el raton a to- da la pantalla. Lectura del joystick ==================== AMOS Basic incluye 6 funciones que te permitiran chequear de forma inmediata los movimientos de un joystick insertado en cual- quiera de los puertos. = JOY (lee el joystick) d=JOY(j) Esta funcion devuelve un numero binario que representa el actual status del joystick del puerto numero "J". Normalmente tu joy se suele poner en el izquierdo (numero 1). Sin embargo, puedes sacar el raton del derecho (numero 0) y reemplazarlo con un joy. El estado del joystick puede leerse inspeccionando el modelo binario de bits que lo representa. Cada bit indica si una accion determinada ha sido realizada por el usuario. Si un bit esta pues to a "1" entonces el test se considera positivo y el joystick ha- bra sido movido en esa direccion. He aqui una lista de los dife- rentes BITS y su significado: BIT Significado --- ----------- 0 Joy arriba 1 Joy abajo 2 Joy izquierda 3 Joy derecha 4 Fuego Si no estas habituado a la notificacion binaria, podras usar los siguientes comandos: =JLEFT (J) (Chequea movimiento del joystick a la izquierda) =JRIGHT(J) ( " " " " derecha) =JUP (J) ( " " " arriba) =JDOWN (J) ( " " " abajo) 144 X=JLEFT(j) X=JRIGHT(j) X=JUP(j) X=JDOWN(j) Estas funciones devuelven un valor de -1 (cierto) si el joystick en el puerto J ha sido movido en la direccion definida. Un valor de 0 (falso) indicara que no se ha producido dicho movimiento. Deteccion de colisiones ======================= Si estas diseñando un juego de arcade es vital asegurarse de chequear las colisiones que se produzcan entre diversos objetos de la pantalla. AMOS Basic incluye cinco poderosas funciones que te permiten realizar ese chequeo de forma rapida y facil. 1- Deteccion de colision con un sprite SPRITE COL (detecta colisiones entre 2 sprites hardware) C=SPRITE COL (n¡,s TO e¿) Esta funcion te facilita un modo simple de comprobar si han coli- sionado en pantalla dos o mas sprites. "N" hace referencia a un sprite hardware activo sobre el que se comprueba la colision. Si esta ha ocurrido, un valor -1 (cierto) sera devuelto, de otra for ma, resultara un valor 0 (falso). El formato estandard de esta funcion chequea todas las colisio nes. Pero tu tambien podras verificar un determinado grupo de sprites usando una version de este comando: C= SPRITE COL n,s to e La instruccion anterior chequea colisiones entre el SPRITE N y los sprites S hasta E (inclusive). Una vez que se haya detectado una colision, podras conocer el numero individual de sprite que ha colisionado, utilizando la funcion COL. Recuerda que al usar esta funcion, necesitaras crear una masca ra de sprites previamente, mediante el comando MASK, de otra for- ma las colisiones no seran detectadas. 2- Deteccion de colision con un bob BOB COL ( detecta colisiones entre 2 o mas bobs) C=BOB (n,¡,s to e¿) La funcion BOB COL comprueba si el bob numero N ha colisionado con otro bob. Si se detecta dicha colision, se devolvera un valor de -1 (cierto) en C; en otro caso sera 0 (falso). Normalmente el comando comprobara todas las colisiones, y en- tonces, tendras que especificar que bobs quieres comprobar usando los parametros S to E. El estado individual de esos bobs podra ser comprobado con el comando COL. 145 3- Deteccion de colision entre bobs y sprites SPRITEBOB COL (detecta colisiones entre sprites y bobs) c=SPRITEBOB COL (n¡,s to e¿) Esta funcion comprueba colisiones entre el SPRITE N y uno o mas bobs. El valor de C sera -1 si la colision se ha producido y 0 si esta no ha tenido lugar. Los puntos inicial y final que especifi can dichas colisiones solo se detectaran entre los bobs S y E. De no incluirse dichos puntos, se detectaran todas las colisiones. ATENCION: la deteccion de colisiones entre un sprite y un bob solo es posible en una pantalla de BAJA RESOLUCION (LOWRES). En modo HIRES, el tamaño de los pixels usado para los bobs y sprites es totalmente diferente, y el resultado de esta funcion no es fiable. BOBSPRITE COL (detecta colisiones entre bobs y sprites) c=BOBSPRITE COL (N,¡,s to e¿) Esta funcion comprueba colisiones entre un bob simple y varios sprites. Funciona de forma similar a la anterior. = COL (verifica el status de un sprite o bob despues de la deteccion de una colision) c=COL(n) La funcion COL contiene el status de todos los objetos que han sido previamente comprobados por las funciones de deteccion de colision. Cada objeto que hayas chequeado se asociara con un elemento de esta matriz (COL). Dicho elemento se cargara con -1 si la coli- sion ha afectado al objeto numero N, y con 0 si no lo fuera. El sistema de numeracion es simple: el primer elemento de la matriz contiene el status del objeto numero 1, el segundo representa al objeto numero 2, y asi sucesivamente. Si estas usando las funciones BOBSPRITE COL y SPRITE COL enton ces los objetos seran sprites hardware, de otro modo seran bobs. Al objeto de evitar confusiones, es aconsejable usar esta instruc cion inmediatamente despues de un comando de deteccion. HOT SPOT (establece el "hot spot" o punto caliente de una imagen en el banco de sprite) HOT SPOT image,x,y HOT SPOT image,p Este comando establece el "hot spot" de una imagen almacenada en el actual banco de sprites. El "hot spot" de un objeto se utiliza como punto de referencia para todos los calculos de coordenadas. 146 Existen 2 versiones de esta instruccion: HOT SPOT image,x,y "X" e"Y" son coordenadas medidas desde la esquina superior izqui- erda de la pantalla. Dichas coordenadas se añadiran en el banco de sprites para posicionar convenientemente un objeto (sprite o bob) en pantalla. Sprite image +----------+ Ten en cuenta que es perfectamente : : legal que el "hot spot" quede fuera : x : de la imagen actual. :<-->* : : hot spot: +----------+ HOT SPOT image,p Esta es la forma reducida de la instruccion; en la que se mueve el "hot spot" a una posicion predefinida, y que se numera de 1 a 9. Las posiciones se muestran en el diagrama de abajo, en donde el punto central de la imagen se representa por el valor $11. $00 $10 $20 $01 $11 $21 $02 $12 $22 MAKE MASK (hace una mascara alrededor de una imagen para la deteccion de colisiones) MAKE MASK ¡n¿ Define una mascara alrededor de la imagen numero "N" en el banco de sprites. Esto se usa por AMOS Basic para los comandos de detec cion de colision. Ademas, puedes crear una mascara para cada obje to que desees chequear. Si omites el parametro N, entonces se ge- nerara una mascara para cada objeto del banco de sprite. Esto pue de llevar un poco de tiempo. Es importante recordar que las mascaras se generan automatica- mente en el momento que un bob es dibujado por primera vez en la pantalla. Esto puede causar un significativo retraso en la ejecu- cion de tu programa; asi merece la pena, hacer una llamada a este comando durante el procedimiento de inicializacion de tu programa 4- Colisiones con bloques rectangulares AMOS Basic incluye algunas funciones que te permiten comprobar rapidamente si un sprite o un bob ha entrado en una region rectan gular de la pantalla. Dichas zonas especiales de la pantalla son especialmente uti- les para la deteccion de colisiones en juegos de rebote como ARKA NOID, en donde a cada bloque se le debe asignar su propia zona individual de pantalla. Tambien podras usar dichas zonas para la construccion de botones e indicadores, tan necesarios para los controles de panel y cajas de dialogos. 147 RESERVE ZONE (Reserva espacio como zona de deteccion) RESERVE ZONE ¡n¿ Este comando asigna suficiente memoria para "N" zonas de detec- cion. Debera siempre ser usado antes de definir la zona mediante el comando SET ZONE. La unica limitacion al numero de zonas es la cantidad de memo- ria disponible, asi que es perfectamente factible definir cientos o incluso miles de zonas en cualquiera de tus programas. Para bo- rrar la actual definicion de zonas y reusar la memoria de nuevo para el programa principal, simplemente teclea: RESERVE ZONE (sin incluir parametros) SET ZONE (establece una zona para su comprobacion) SET ZONE z,x1,y1 to x2,y2 Define una zona rectangular que sera posteriormente comprobada mediante los diversos comandos de ZONA. "Z" especifica el numero de la zona que va a ser creada. "x1,y1 TO x2,y2" son las coordena das de las esquinas del rectangulo. Antes de usar esta instruccion necesitaras previamente reser- var algun espacio de memoria mediante el comando anterior. = ZONE (devuelve el numero de zona en que se encuentran las coordenadas que se comprueban) T=ZONE(¡s¿,x,y) Este comando devuelve el numero de la zona de pantalla en donde se ubican las coordenadas graficas "X" e "Y". Normalmente las coordenadas se refieren a la pantalla actual, pero tambien pue- des referirte a otra pantalla opcional (Parametro S de la ins- truccion). Despues de usar ZONE, "T" contendra el numero de la zona espe- cificada, o bien, un valor 0 (falso). Ten en cuenta que ZONE solo devuelve la primera zona en esas coordenadas, no detectando otras zonas que compartan tambien di- chas coordenadas. Es posible usar esta funcion conjuntamente con las funciones X BOB e Y BOB para detectar si un bob ha entrado en una zona espe cifica de pantalla. Esto puede ser realizado mediante la siguien- te linea: X=ZONE(X BOB(n),Y BOB(n)) 148 =H ZONE (devuelve el numero de zona en que sen encuentran las coordenadas hardware que se comprueban) T=HZONE(¡s¿,x,y) Es identico al anterior, solo que la posicion de pantalla es me- dida ahora en coordenadas hardware. Podras ademas usar esta fun- cion para detectar si un sprite hardware ha entrado en alguna de tus zonas de pantalla. Por ejemplo: X=HZONE(X SPRITE(n),Y SPRITE(n)) Vease tambien ZONE, MOUSE ZONE, SET ZONE y ZONE$ =MOUSE ZONE (comprueba si el puntero del raton ha entrado en una zona especifica) X=MOUSE ZONE Esta funcion devuelve el numero de la zona de pantalla actualmen te ocupada por el puntero del raton. Es equivalente a la linea: X=HZONE(X MOUSE,Y MOUSE) RESET ZONE (borra una zona) RESET ZONE ¡z¿ Este comando desactiva permanentemente cualquiera de las zonas creadas por SET ZONE. Si el numero opcional "Z" es incluido, solo sera esa la zona reseteada, de otro modo, todas las zonas se rese tearan. No olvides que RESET ZONE solo borra las zonas definidas, y no afecta a la memoria reservada por el comando RESERVE ZONE. Prioridad de bobs ================= PRIORITY ON/OFF (cambia la prioridad) PRIORITY ON/OFF Se asigna un valor de prioridad a cada bob que oscila entre 0 y 63. AMOS Basic usa este numero para decidir en que orden aparece- ran los objetos en pantalla. Como regla general, cualquier bob con la mas alta prioridad sera siempre mostrado sobre los demas objetos de menor prioridad. El valor de prioridad es directamente tomado del numero de un bob. Deberas recordar este hecho cuando estes asignando numeros a tus bobs. La eleccion del numero tendra importantes efectos sobre la apariencia de los objetos en pantalla. 149 Ademas del sistema estandard, tambien es posible ordenar los bobs de acuerdo con su posicion en pantalla. PRIORITY ON otorga el mayor valor de prioridad a los bobs con las mas altas coordena das Y. Esto te permite crear una util ilusion de perspectiva en tus programas. Mira el ejemplo siguiente: Load "AMOS_DATA/Sprites/Monkey_right.abk":CLS:Flash off Get sprite palette Priority Off:Rem establece el modo normal Bob 1,160,100,2:Bob2,0,72,2:Bob3,320,128,2 Channel 2 to bob 2:Channel 3 to bob 3 Amal 2,"Loop: M 320,0,320 ; M -320,0,320 ; Jump loop" Amal 3,"Loop: M -320,0,320 ; M 320,0,320 ; Jump loop" Amal On Wait Key Priority on: Rem establece el modo Y Wait Key Normalmente, ambos movimientos de bobs pasan por debajo del objeto en el centro. Cuando estableces el modo Y de prioridad, los bobs se ordenan ahora en funcion de sus coordenadas Y. Asi, el bob 3 se mueve sobre el bob 1, mientras que el bob 2 pasa sua- vemente tras el. TRUCO: normalmente lo mejor es posicionar el "hot spot" del spri- te en su base. Esto se debe a que su coordenada Y, usada por este comando, se referira siempre a su "hot spot" en pantalla. Tambien tienes que advertir que la instruccion PRIORITY OFF puede ser usa da para resetear la prioridad hacia el modo normal. Comandos miscelanea =================== UPDATE (cambia automaticamente la actualizacion de bobs/sprites) UPDATE ¡ON/OFF¿ Normalmente cualquier objeto que dibujes en pantalla sera automa- ticamente redibujado cada vez que sea animado o movido. Esto pue- de ser termporalmente desactivado usando el comando UPDAT OFF. Mientras la actualizacion este desactivada, los comandos de SPRITES, BOB y AMAL aparentemente carecen de efecto. Actualmente, todas tus animaciones estan trabajando correctamente, solo que el resultado no aparece en pantalla. Entonces podras obligar a que las operaciones de dibujo se realizan cuando lo desees mediante este comando. 150 Existen 3 formatos distintos para este comando: 1- UPDATE OFF Desactiva la actualizacion automatica 2- UPDATE Redibuja cualquier sprite que haya cambiado su posicion origi- nal 3- UPDATE ON Activa el sistema normal de actualizacion.