192 AMOS Basic te permite asignar al teclado algunos de tus items de menu. Al pulsar esas teclas se interpretara exactamente que el usuario ha accedido a una determinada opcion del menu. Esto puede utilizarse conjuntamente con los comandos de menus de AMOS, inclu so con ON MENU. MENU KEY (asigna una tecla a un item del menu) MENU KEY(,,) TO c$ MENU KEY(,,) TO scan ¡,shift¿ Este comando te permite asignar cualquier tecla a un item de un menu previamente definido. La unica limitacion consiste en que este item que has especificado, debe radicar en el nivel mas infe rior de nuestro menu. Asi no podras usar teclas para acceder a un submenu, ya que a cada tecla debe corresponder una opcion simple del menu. "C$" es una cadena que contiene un caracter simple que sera asignado a la opcion del menu. Cualquier caracter adicional de la cadena sera ignorado. A cada tecla del teclado del Amiga se le asigna su propio codi go individual. Asi mediante la utilizacion de este codigo, podras utilizar teclas dentro de un menu, sin que estas tengan un equiva lente ASCII. Como ejemplo, aqui tienes una lista de codigos que pueden usarse en tus menus: Codigo Tecla ------ ----- 80-89 F1-F10 95 Help 69 Esc "SHIFT" es un mapa-BIT opcional que te permite comprobar la existencia de combinaciones de teclas de control como por ejemplo ALT+HELP o CONTROL+D. El formato de shift es el siguiente: BIT Tecla chequeada Notas --- --------------- ----- 0 SHIFT izquierda Solo un SHIFT puede chequearse al 1 SHIFT derecha mismo tiempo 2 Caps Lock Si esta en ON o en OFF 3 CTRL 4 ALT izquierda 5 ALT derecha 6 AMIGA izquierda O tecla C= en algunos aparatos 7 AMIGA derecha Ten presente que si activas mas de un bit de este modelo, tendras que presionar varias teclas simultaneamente para conse- guir llamar al item. Cualquiera de esas asignaciones a teclas, podra ser anulada simplemente con usar MENU KEY sin ningun para- metro a continuacion. Por ejemplo: Menu Key(1,10) 193 Con la ayuda del comando MENU KEY, realizar asignaciones al teclado para un menu, es una tarea facil, asi que incluyas este tipo de funciones en tus programas. He aqui un ejemplo que com- prueba la tecla de funcion F-10: Menu$(1)=" Function Keys " For A=1 to 10 OPT$=" F"+STR$(a)+" " Menu$(1,A)=OPT$ Menu Key(1,A) to 79+A Next A Menu On Do If Choice then print "Pulsada tecla de funcion ";Choice(2) Loop 3- Comandos de control de menu MENU ON ¡bank¿ Activa un meno que ha sido previamente definido en tu programa. El menu se visualizara cuando el usuario presione el boton dere- cho del raton, y la opciones podran ser seleccionadas de la forma habitual. Si se añade un numero de banco ("BANK"), entonces el me nu se tomara del consiguiente banco de memoria. Vease MAKE MENU BANK para mas detalles. MENU OFF Opuesto al anterior, desactiva temporalmente un menu. Va a conge- lar temporalmente la accion de todo el menu. Dicho menu podra vol verse a usar mediante MENU ON. MENU DEL Borra el menu seleccionado de la memoria del Amiga habilitando la memoria para el resto del programa. Existen 2 formatos posibles: a) Menu Del Borra todo el menu. ATENCION: esta orden es irreversible b) Menu Del(,,) Borra solo una parte del menu. Los parametros (,,) contienen un listado de hasta 8 valores separados por comas, que indican la posicion precisa de items en la jerarquia del menu. Ejemplo Menu Del(1): Rem borra el titulo numero 1 Menu Del(1,2): Rem borra la opcion 2 del titulo 1 194 MENU TO BANK (graba las definiciones de un menu dentro de un banco de memoria) MENU TO BANK n Esta instruccion te permite grabar un arbol completo de menu en el banco de memoria "N". Si dicho banco ya existiera, obtendras un mensaje de error (Bank already reserved). Una vez almacenado un menu de este modo, se grabara automatica mente con el resto de tu programa Basic. El almacenamiento de las definiciones de menu en un banco de memoria, reducira significati vamente el tamaño del listado de tu programa. Esto dejara espacio disponible en la memoria de edicion, y te permitira escribir un mayor programa Basic usando la misma cantidad de memoria. BANK TO MENU (recupera un menu grabado en un banco) BANK TO MENU N Recupera las definiciones de un menu desde el banco de memoria N. Tu menu sera habilitado exactamente en el mismo lugar de donde fue originalmente grabado. Si el menu es complejo, este proceso llevara algun tiempo. Para activar tu nuevo menu tendras que lla- mar a la instruccion MENU ON. MENU CALC (calcula otra vez un menu) MENU CALC Una de las mas atractivas caracteristicas de los menus AMOS es que pueden facilmente cambiar a lo largo de un programa. Despues de que hayas creado tus definiciones iniciales, podras añadir nue vos items y reemplazar las opciones existentes. Todos tus items se reposicionaran automaticamente cuando se seleccione el menu con el boton derecho del raton. Si tus menus son extremadamente grandes, esto puede llevar algun tiempo. Este comando te permite realizar este proceso en el momento mas apro- piado de tu programa, evitando asi retrasos innecesarios. Ten presente que para evitar que el usuario haga llamadas al menu, mientras este esta siendo cambiado, se te avisara de que los menus estan congelados mediante el comando MENU OFF al inicio de este proceso. Posteriormente se podra acceder libremente con el comando MENU ON. Los menus desarrollados son particularmente utiles en los juegos de aventuras, ya que en cada situacion pue- den contener sus propias opciones que se actualizarian dependien- do de las diversas situaciones. 195 Comandos adicionales de menu Cualquier cadena de menu puede incluir opcionalmente un poten te juego de comandos adicionales que te permitiran personalizar la forma de tus menus hasta un punto increible. La lista de coman dos deben enmarcarse entre parentesis y separarse por dos puntos (:). Por ejemplo: Menu$(1)="(Locate 10,10 : Ink 1,1) Hello" Cada instruccion consiste en un par de caracteres que pueden es- tar tanto en mayusculas como en minusculas. Cualquier otra cosa sera ignorada completamente. La mayoria de los comandos requieren que indiques uno o dos parametros. Dichos numeros NUNCA se consi- deraran como expresiones. A continuacion presentamos el listado de comandos. Recuerda que la sintaxis hemos puesto a los dos caracteres re- levantes en mayusculas o en negrita. BOb (dibuja un bob) BOb n El comando BOb dibuja el bob numero N en la actual posicion del cursor. No se tiene en cuenta al "hot spot" del bob y todas las coordenadas se mediran en funcion de la esquina supero-izquierda Tambien recuerda que el color 0 es habitualmente considerado como transparente. Esto se podra cambiar usando el comando NO MASK des de AMOS Basic. Por ejemplo: Load "AMOS_DATA:Sprites/Octopus.abk" Menu$(1)="(BOb 1) 1": Menu$(1,1)="(BOb 2) 2" Menu$(1,2)=(Bob 3) 3" Menu On: Wait Key ICon (dibuja un icono) ICon n Dibuja el icono N en la actual posicion del cursor. Ten en cuenta que a diferencia de los bobs, el color 0 NO es habitualmente tras parente. Vease el comando Basic MAKE ICON MASK para mas detalles. LOcate (mueve el cursor grafico) LOcate x,y Este comando mueve el cursor grafico a las coordenadas x,y medi- das en relacion a la esquina supero-izquierda de la linea de menu Ten presente que despues una instruccion el cursor grafico siem- pre sera reposicionado en la parte infero-derecha del objeto que acaba de dibujar. Esas coordenadas tambien seran usadas para de- terminar la posicion de cualquier otro item de tu menu, como: 196 Menu$(1)="Example ":Menu$(1,1)="Locate (Lo 50,50) in action " Menu$(1,2)="Guess my cords" Menu On: Wait Key INk (establece color para tinta y papel) INk n,value El comando INK asigna los indices de color a usar por los colores PEN, PAPER y OUTLINE. He aqui una lista con las posibilidades: N Efecto --- ------ 1 Establece color de PEN 2 " " PAPER 3 " " OUTLINE SFont (establece fuente) SFont n Este comando establece la actual fuente en la fuente GRAFICA nume ro N. Esto sera utilizado en todas los futuros items. Ten presen- te que debes llamar a GET FONTS antes de ejecutar este comando, de otro modo solo podras usar 2 fuentes. Ver ejemplo 16.5. SStyle (establece estilo) SStyle N Este comando establece el estilo de la actual fuente en N, que se trata de un modelo-BIT con el siguiente formato: BIT Efecto --- ------ 0 Subrayado 1 Negrita 2 Italica LIne (dibuja una linea) LIne x,y Este comando dibuja una linea desde la actual posicion del cursor hasta las coordenadas graficas X,Y. Ver ejemplo 16.6. 197 SLine (establece el patron de linea) SLine p Establece el estilo de linea a usar en los siguientes comandos LINE segun un modelo-BIT contenido en "P". Si no se incluye nin- guna expresion, este modelo sera siempre convertido a notacion decimal antes de usarse. Una demostracion simple de los posibles estilos de linea los podras encontrar en el ejemplo 16.7. BAr (dibuja una barra) BAr x,y Este comando dibuja una barra rectangular desde las coordenadas actuales del cursor hasta X,Y. Ver ejemplo 16.8. OUtline (enmarca una barra) OUtline flag Dibuja un borde en la actual color de outline (INK 3) alrededor de todas las siguientes barras. Un valor de 1 activa el borde y 0 lo elimina. ELlipse (dibuja una elipse) ELlipse r1,r2 Dibuja un ovalo con los radios r1 y r2 en las coordenadas actua- les del cursor. Para dibujar un circulo basta con hacer coincidir el valor de r1 y r2. Vease ejemplo 16.9. PRoc (llama a un procedimiento) PRoc name Esta instruccion te permite llamar a un procedimiento Basic direc tamente desde un menu. El procedimiento en cuestion no debe conte ner parametros, o de otra forma se produciria un mensaje de error Este comando permite personalizar el menu de acuerdo a tus pro pias necesidades sin tener que limitarte a los comandos disponi- bles de menu. Al objeto de explotar todas sus caracteristicas, ne cesitaras comprender un poco de teoria: Al comienzo de tu procedimiento los siguientes valores son al- macenados en los registros del procesador 68.000: Dreg(0) X-Coord Este contiene la coordenada grafica X de la esquina supero-izqui- erda del actual item del menu. No debes dibujar tus graficos mas a la izquierda de este punto, ya que alterarias el proceso de re- dibujo del menu ocasionando efectos no deseados. 198 Dreg(1) Y-Coord Este registro contiene la coordenada Y de dicho item. Como antes, deberas limitar tus operaciones graficas a la region por debajo de este punto para evitar posibles errores. Dreg(2) Status de las operaciones graficas Este registro contiene el actual status de las operaciones del menu. Si tiene un valor de 0 (falso), el item del menu estara siendo dibujado. En este caso necesitaras cargar Dreg(0) y Dreg (1) con las coordenadas de la esquina infero-derecha de tu zona de menu y volver inmediatamente del procedimiento. Si Dreg(0) es -1 (cierto) tendras plena libertad para realizar tus operaciones graficas en dicho procedimiento. Despues de que hayas acabado, deberas reponer las coordenadas de la esquina infero-derecha del item en los registros Dreg(0) y Dreg(1). Dreg(3) Status del item de menu Se cargara con un valor -1 si el menu esta sobreimpresionado y se esta mostrando la primera cadena del menu, de otro modo contiene el valor 0. Dreg(4) Se pone en -1 (cierto) cuando el ramal del menu es inicializado Areg(1) Direccion de la zona reservada Esta es la direccion de la zona creada con RESERVE. Se usa para permitir que varios procedimientos se comuniquen entre si. Vease RESERVE para mas detalles. La estructura general de un procedimiento de menu es: Procedure ITEM If Dreg(2) X=Dreg(0):Y=Dreg(1) .... dibuja el item ... Endif Dreg(0)=BX Dreg(1)=BY End Proc Las dimensiones del item de menu visualizado en pantalla se obtienen en las coordenadas BX,BY. Dichos valores deben ser car- gados en los registros D0 y D1 antes de abandonar el procedimien to ya que ellos necesitan crear el final de la barra de menu. Mientras dentro de tu procedimiento, podras realizar la mayor parte de las instrucciones AMOS, incluyendo otros procedimientos. Pero algunas instrucciones estan totalmente prohibidas!! Si usas esos comandos, no obtendras mensaje de error, pero tu Amiga puede dañarse. 199 * NUNCA cambies de pantalla actual desde un menu * No establezcas o resetees una zona de pantalla * Evitar el uso de instrucciones como WAIT, WAIT KEY, INPUT o INKEY$ * Las operaciones con discos estan completamente prohibidas REserve (reserva area para las datas de un procedimiento) REserve n Reserva "N" bytes de memoria pra este item de menu. A esta area se podra acceder desde dentro de tu menu, usando la direccion con tenida en AREG(1). El area de datos creada, puede usarse para las cadenas del menu actual. Puede usarse para cambiar parametros en- tre los diversos procedimientos llamados por un item. MENU CALLED (Redibuja un item continuamente) MENU CALLED(,,) Redibuja automaticamente el item seleccionado 50 veces por segun- do cuando sea visualizado en pantalla. Usualmente se utiliza con- juntamente con un procedimiento de menu para generar items anima dos que cambian delante de tus ojos. Cuando uses esta funcion, primero necesitaras definir un proce dimiento de menu, usando los principios citados anteriormente. Luego añades una llamada a este procedimiento en el titulo desea- do usando un comando MENU CALL. Cuando el usuario visualiza el item elegido, se accedera repetidamente a tu procedimiento por el sistema de menu, Dado que se accede a tu procedimiento 50 veces por segundo, debe existir, obviamente, algo que haga regresar tan rapidamente como sea posible al menu. Esto te permitira tiempo suficiente para ejecutar el resto de instrucciones del menu. Tambien ten presente que el procedimiento añadido al menu, pue de libremente animar item mediante bobs o sprites. Sin embargo, como los items de menu NO aceptan el DOUBLE BUFFER, tus bobs pue- den temblar levemente en pantalla. Asi sera mejor usar sprites computerizados para este proposito. Otra posibilidad consiste en dibujar tu pantalla mediante los comandos graficos de AMOS. Un ejemplo de esto puede apreciarse en el ejemplo 16.11. MENU ONCE (anula el sistema automatico de redibujo) MENU ONCE(,,) Desactiva el sistema automatico de actualizaciones puesto en mar- cha con el comando anterior. 200 Estilos alternativos de menu Normalmente los titulos de un menu se muestran como una linea horizontal y las opciones se ordenan por debajo de el en una co- lumna vertical de opciones. Si deseas crear algo un poco original puedes cambiar el formato de cada nivel de tu menu, usando las siguientes 3 instrucciones: MENU LINE (Muestra un menu en una barra horizontal de items) MENU LINE level MENU LINE (,,) Este comando muestra las opciones del menu en el nivel deseado en forma de barra horizontal. Esta linea de menu comienza en la es- quina izquierda del primer titulo y alcanza la esquina inferior- derecha del ultimo. MENU LINE level Define el estilo de menu de todo un nivel de un menu. Solo podra llamarse durante la definicion de menu. MENU LINE(,,) Normalmente solo se podra usar el formato anterior. Pero a veces, es interesante remarcar algunos items individuales de la barra de menu, en dichos casos sera util este formato. MENU TLINE (Muestra un menu como una linea total) MENU TLINE level MENU TLINE(,,) Muestra una seccion del menu como una "linea total" que se extien de desde la parte mas izquierda de la pantalla hasta la parte mas a la derecha. Toda la linea sera dibujada incluso cuando el item deseado se encuentre en el centro de la pantalla. "LEVEL" es un numero que oscila entre 1-8 que especifica la parte del menu que sera afectada. Esta es la forma estandard de la instruccion, y debera ser usada solo durante las definiciones de menu, o de otro modo no producira efecto alguno. Tambien puedes cambiar la apariencia de un menu despues de que este haya sido creado, utilizando un segundo formato de esta ins- truccion. Por ejemplo: Menu Line(1,1): Rem muestra menu 1,1 como una linea) 201 MENU BAR (Muestra una seccion del menu como una barra) MENU BAR level MENU BAR (,,) Este comando muestra el item seleccionado en forma de columna o barra vertical. La anchura de esta barra se establece automatica- mente segun las dimensiones del mayor de los items de tu menu. "LEVEL" es el numero que indica que parte del menu actual va a ser afectada. Por defecto, esta opcion se usa para los niveles 2 al 8 de tu menu. Ten presente que esta forma de instruccion solo puede emplearse durante la fase de definicion de tu programa. ",," es una lista de parametros que te permitiran cambiar el estilo de tus menus una vez que hayan sido instalados. He aqui un ejemplo de Menu Bar y Menu Tline: Flag=0 SET_MEN Do If Choice and Choice(1)=2 And Choice(2)=1 then ALTER Loop Procedure SET_MEN Menu$(1)=" Bar Demo " : Menu$(2)=" Selecciona abajo " Menu$(1,1)=" No pasa nada !" Menu$(2,1)=" Si, pulsala !" Menu On End Proc Procedure ALTER Shared ALTER Menu Del If Flag=0 then Menu Bar 1 :Flag=1 else Menu TLine 1 :Flag=0 SET_MEN End Proc MENU INACTIVE (Desactiva un item de menu) MENU INACTIVE level MENU INACTIVE (,,) Como su nombre indica, este comando desactiva una serie de opcio nes de tu menu. Cualquier intento posterior de seleccionar dichos items sera totalmente ignorado. "LEVEL" te permitira desactivar una seccion completa del menu, pero tambien podras desactivar op- ciones individuales del menu con los paramtros (,,), que indica- ran la posicion exacta del item dentro de la jerarquia del menu. Ten presente que los items que hayas desactivado con esta ins- truccion seran sustituidos por la cadena INACTIVE$ que ya habras especificado durante el proceso de definicion de menus. Si dicha cadena fuera omitida, las opciones no disponibles o desactivadas del menu apareceran (por defecto) en italicas. 202 MENU ACTIVE (Activa un item de menu) MENU ACTIVE level MENU ACTIVE (,,) Simplemente invierte el efecto del comando anterior. Despues de que ejecutes esta instruccion, las opciones seleccionadas aparece ran automaticamente con sus titulos originales. Menus moviles ============= Los menus de AMOS pueden presentarse en cualquier punto de la pantalla. Tambien, los menus podran moverse explicitamente por el usuario o bien desde tu programa. MENU MOVABLE (Activa el movimiento automatico de menu) MENU MOVABLE level MENU MOVABLE (,,) Informa al sistema de menus que los items del menu, del nivel es- pecificado por "LEVEL" pueden moverse directamente por el usuario Siendo este el valor por defecto. Existe un segundo formato del comando que te permite establecer el status de cada item individual de un menu. Los parametros en- tre parentesis pueden indicar una posicion cualquiera de la jerar quia del menu. Cualquier menu puede ser reubicado simplemente colocando el pun tero del raton sobre el primer item del menu pulsando el boton iz quierdo del raton. Una caja rectangular aparecera ahora sobre el item seleccionado, y este se movera a cualquier punto de la panta lla actual. Cuando sueltes el boton del menu se redibujara en la nueva posicion con todos los demas items asociados. Ten presente que este comando no te permite cambiar el ordena- miento de los items por debajo de este nivel. Si deseas manipular las opciones individuales del menu, necesitaras un comando MENU ITEM. Vease el ejemplo 16.12. para una demostracion de este siste ma. MENU STATIC (Fija un menu en un lugar) MENU STATIC level MENU STATIC (,,) Define el nivel ("LEVEL") de un menu que sera inamovible por el usuario. Uno de los problemas de los menus moviles es la cantidad de memoria que consumen al cambiar durante el curso de tu progra- ma. Si tus menus son particularmente grandes, o si la memoria de que dispones es escasa, esto podra ocasionar problemas para el usuario, con la obtencion de un mensaje de error (OUT OF MEMORY). Con la ayuda de este comando podras evitar esta dificultad por completo. 203 MENU ITEM MOVABLE (Mueve opciones individuales de un menu) MENU ITEM MOVABLE level MENU ITEM MOVABLE (,,) Este comando es similar al comando MENU MOVABLE, con la unica di- ferencia de que te permite reordenar las diferentes opciones den tro de un nivel. De este modo, todos los items dentro de una ba- rra de menu podran ser individualmente reposicionados por el usua rio. Habitualmente es ilegal mover los items fuera de la barra de menu, pero esto puede evitarse con el comando MENU SEPARATE. Al objeto de movilizar los items de un menu, TODA la barra de menu debera poderse mover. Asi si fijas en un lugar el menu mediante el comando MENU STATIC, este comando no tendra tampoco efecto. De forma adicional, no puedes mover el primer item de una barra de menu hasta que no muevas toda la linea. Otro efecto es que movien do el ultimo item del menu se reducira permanentemente el tamaño de tu barra de menu. Para esto, existen 2 soluciones posibles: * Encerrar toda la barra con una caja rectangular, como sigue: Menu$(1,1)=,,,"(Bar 40,100)(Lov0,0)" En donde MENU$(1,1) es el primer item de tu barra actual * Fijar el ultimo item con MENU ITEM STATIC MENU ITEM STATIC (Fija un item) MENU ITEM STATIC level MENU ITEM STATIC (,,) Este comando fija uno o mas items en un determinado lugar, y es el formato por defecto. MENU SEPARATE (Separa una lista de items de menu) MENU SEPARATE level MENU SEPARATE (,,) Indica a AMOS que separe todos los items de un nivel. Cada item del menu se tratara de forma completamente independiente del res- to. Si no has definido una cadena de fondo, cada item aparecera con dos pixels sobre el anterior. Esto crea un atractivo efecto de escalera que puede eliminarse editando el menu con el acceso- rio MENU. Los parametros opcionales de esta instruccion te permiten divi- dir la barra de menu en cualquier parte de la linea. Una vez ha- yas separado un item, el solo se afectara por los comandos MENU MOVABLE, en vez de las instrucciones de ITEM. 204 MENU LINKED (une un juego de menus) MENU LINKED level MENU LINKED (,,) Este comando une uno o mas items de menu. Es la orden opuesta a MENU SEPARATE. = MENU X (devuelve la coordenada grafica X de un item) X=MENU X(,,) Esta funcion te permite la posicion de un item determinado con respecto a una previa opcion de pantalla. Puedes usar informacion complementaria en el ejemplo 16.13. = MENU Y (devuelve la coordenada grafica Y de un item) Y=MENU Y(,,) Devuelve la coordenada Y de una opcion de menu. Advierte que to- das las coordenadas se miden en relacion al item previo. Por esto no se trata de coordenadas estandard de pantalla!! 1- Moviendo un menu dentro de un programa MENU BASE (mueve el punto de comienzo de un menu) MENU BASE x,y Este comando mueve el punto de comienzo del primer nivel de tus menus a las coordenadas de pantalla X,Y. Todos los items subordi nados del menu, se visualizaran por tanto en relacion a la parte mas alta de este menu. Ver ejemplo 16.14 para una demostracion de este comando. SET MENU (mueve un menu) SET MENU (,,) TO x,y Establece las coordenadas de la esquina supero-izquierda de un item de menu. Esas coordenadas se miden de forma relativa al ni- vel previo. El punto de comienzo de todo el menu (coordenadas 0,0) debe establecerse con el comando MENU BASE. Todos los niveles inferiores del menu tambien se desplazaran por esta instruccion. Sus posiciones relativas no cambiaran. Dado que X,Y pueden ser numero negativos, es posible mostrar los items de la barra de menu en la forma de un panel de control. Vease el ejemplo 16.15. 205 2- Ejecucion de un menu en la posicion del cursor MENU MOUSE (Muestra el menu bajo el raton) MENU MOUSE ON/OFF Este comando muestra automaticamente todos los menus comenzando en la actual posicion del cursor del raton. Las coordenadas del raton se transfieren a MENU BASE para obtener la posicion final, asi es posible instalar el menu a una determinada distancia del puntero del raton, si asi lo deseas. Ver ejemplo 16.16.