25 de marzo de 2010

Botones y el control del ratón

He terminado la estructura del ratón junto con el control de funcionamiento de los botones. Los botones han sido modificados gráficamente para incluír dos estados; normal y botón pulsado. (El color magenta de las intersecciones es para la transparencia RGB (255,0,255).



En este gráfico están dibujados 4 botones y 2 estados. Los botones corresponden al menú principal y permiten acceder a juego, opciones, info y volver. En la zona superior están los botones en estado normal y debajo se dibujan los mismos botones pero un poco modificados, para que se aprecie que se están pulsando (en este caso simplemente modifico el color del borde a rojo).

Propiedades de un botón:

- Boton_Menu_A.PosicionX <- Posición X px en pantalla.
- Boton_Menu_A.PosicionY <- Posición Y px en pantalla.
- Boton_Menu_A.Ancho <- Ancho en px del botón.
- Boton_Menu_A.Alto <- Alto en px del botón.
- Boton_Menu_A.Grafico <- Código del gráfico dentro de "anim".
- Boton_Menu_A.Activado <- 0 No activado / 1 activado.
- Boton_Menu_A.Encima <- 0 No se pulsa / 1 Mantiene pulsación.
- Boton_Menu_A.Pulsado <- 0 n/a / 1 Botón seleccionado.

La variable que controlará los estados corresponde a boton.Encima, que controlamos en el bucle del fichero raton.gbas.

Para el funcionamiento del bucle incluyo un organigrama en el que muestro los diferentes controles que realizo para cada botón. Los botones opciones e info también tienen el mismo bucle aunque no se representa por falta de espacio.



Finalmente el código sin optimizar (sólo emplea IF/THEN):

 FUNCTION ControlRaton: Local_ModoMaquina  
   
   MOUSESTATE mx, my, b1, b2  
   
   IF b1=TRUE  
     Estado_Raton=1  
     Pos_Raton_X=mx  
     Pos_Raton_Y=my  
   ENDIF  
   
   IF b1=FALSE  
     IF Boton_Menu_A.Encima=1  
       ModoMaquina=1 //JUEGO  
     ENDIF  
   
     IF Boton_Menu_B.Encima=1  
       ModoMaquina=2 //OPCIONES  
     ENDIF  
   
     IF Boton_Menu_C.Encima=1  
       ModoMaquina=3 //INFO  
     ENDIF  
   
     IF Boton_Menu_D.Encima=1  
       ModoMaquina=0 //MENU  
     ENDIF  
   
     Boton_Menu_A.Encima=0  
     Boton_Menu_B.Encima=0  
     Boton_Menu_C.Encima=0  
     Boton_Menu_D.Encima=0  
     Estado_Raton=0  
     RETURN  
   ENDIF  
   
   IF Estado_Raton=1 AND Local_ModoMaquina=0  
     Boton_Menu_A.Encima=0  
     Boton_Menu_B.Encima=0  
     Boton_Menu_C.Encima=0  
   
     IF Boton_Menu_A.Activado=1 AND Pos_Raton_X >= Boton_Menu_A.PosicionX AND Pos_Raton_X <= Boton_Menu_A.PosicionX + Boton_Menu_A.Ancho AND Pos_Raton_Y >= Boton_Menu_A.PosicionY AND Pos_Raton_Y <= Boton_Menu_A.PosicionY + Boton_Menu_A.Alto  
       Boton_Menu_A.Encima=1  
     ENDIF  
   
     IF Boton_Menu_B.Activado=1 AND Pos_Raton_X >= Boton_Menu_B.PosicionX AND Pos_Raton_X <= Boton_Menu_B.PosicionX + Boton_Menu_B.Ancho AND Pos_Raton_Y >= Boton_Menu_B.PosicionY AND Pos_Raton_Y <= Boton_Menu_B.PosicionY + Boton_Menu_B.Alto  
       Boton_Menu_B.Encima=1  
     ENDIF  
   
     IF Boton_Menu_C.Activado=1 AND Pos_Raton_X >= Boton_Menu_C.PosicionX AND Pos_Raton_X <= Boton_Menu_C.PosicionX + Boton_Menu_C.Ancho AND Pos_Raton_Y >= Boton_Menu_C.PosicionY AND Pos_Raton_Y <= Boton_Menu_C.PosicionY + Boton_Menu_C.Alto  
       Boton_Menu_C.Encima=1  
     ENDIF  
   ENDIF  
   
   IF Estado_Raton=1 AND Local_ModoMaquina=2  
     Boton_Menu_D.Encima=0  
   
     IF Boton_Menu_D.Activado=1 AND Pos_Raton_X >= Boton_Menu_D.PosicionX AND Pos_Raton_X <= Boton_Menu_D.PosicionX + Boton_Menu_D.Ancho AND Pos_Raton_Y >= Boton_Menu_D.PosicionY AND Pos_Raton_Y <= Boton_Menu_D.PosicionY + Boton_Menu_D.Alto  
       Boton_Menu_D.Encima=1  
     ENDIF  
   ENDIF  
   
   IF Estado_Raton=1 AND Local_ModoMaquina=3  
     Boton_Menu_D.Encima=0  
   
     IF Boton_Menu_D.Activado=1 AND Pos_Raton_X >= Boton_Menu_D.PosicionX AND Pos_Raton_X <= Boton_Menu_D.PosicionX + Boton_Menu_D.Ancho AND Pos_Raton_Y >= Boton_Menu_D.PosicionY AND Pos_Raton_Y <= Boton_Menu_D.PosicionY + Boton_Menu_D.Alto  
       Boton_Menu_D.Encima=1  
     ENDIF  
   ENDIF  
   
 ENDFUNCTION  

Codificación rústica, pero eficaz... ya habrá tiempo para depurar y optimizar el programa.

No hay comentarios: