Vistas de página en total

domingo, 11 de agosto de 2013

WAITMOUSE

    Como dije en la entrada donde expuse el juego TIC_TAC_TOC completo (TIC_TAC_TOC 5/5),  la parte del programa en donde analizamos la pulsación del ratón, comprobamos que se encuentra dentro de el tablero y la transformamos en coordenadas de texto, puede resultar muy útil en en futuro.
    Este es un caso típico. Mientras programamos aplicaciones, nos damos cuenta que ciertas partes de las funciones pueden resultarnos muy útiles en el futuro. Es ahí cuando debemos crear nuevas instrucciones y librerías. Por esto, es deseable pararnos un momento a pensar, pues esto es lo que nos dará una nueva herramienta, y aumentará nuestro poder informático. Además nos aliviará de carga de trabajo para el futuro.

  Eso sí, hay que pensarlo bien.
  He visto que la función  me ha servido bien, y que es muy útil, si quisiera obtener la posición del ratón en coordenadas de texto y limitar su acción a una sección de pantalla como es el caso de una ventana.
    Esta función sera muy útil para gestión de menús desplegables y ventanas emergentes.
   Si la hiciéramos tal y como está en el juego no nos sirve, pues está pensada para hacer una matriz de 2 caracteres. Además se queda esperando una pulsación, lo cual nos impediría analizar varias ventanas en un mismo programa.
   Si miramos la sección de programa veremos que en realidad tiene dos partes.
   En la primera esperamos el flanco de subida de la pulsación del ratón. Eso ya sería algo útil por si mismo. Incluso, se puede pensar en hacer una función que detecte el flaco de subida o el de bajada. Es decir, detecte "push mouse" y "release mouse".
   En la segunda parte se leen e interpretan como validas las coordenadas, pasándolas a coordenadas relativas a la ventana

ESPERA PULSACIÓN
   La sección de programa es:

 espera:
        getmouse                ;lee el estado del raton
        cmp ax,1
        jnz actual              ;si no se ha pulsado se espera
        cmp bx,ax               ;si se pulso se verifica si ha sido un
        mov bx,ax               ;flanco de subida
        jnz  seleccion           ;si es así se selecciona la opción deseada
actual:
        mov bx,ax
        jmp espera
seleccion:
   
       Este código está hecho para pasar de 0 a 1 en el estado del ratón.
       El código de abajo en cambio detectaría el paso de 1 a 0

 espera:
        getmouse                ;lee el estado del raton
        cmp ax,0
        jnz actual              ;si no se ha pulsado se espera
        cmp bx,ax               ;si se pulso se verifica si ha sido un
        mov bx,ax               ;flanco de bajada
        jnz  seleccion           ;si es si se selecciona la opción deseada
actual:
        mov bx,ax
        jmp espera
seleccion:

    Ya tenemos, por lo tanto definida la función. La vamos a llamar waitmouse. Esta función esperará la pulsación y como parámetro le daremos press o release , para seleccionar el flanco 0->1 0 1->0. Si no se indica nada será press.

    Como se ve no hace falta más que cambiar la primera comparación, por lo que press=1 release=0.
    Para implementarla añadiremos estas constantes y la definición con la llamada a la función en mouse.mac, y crearemos una rutina para almacenar en la librería.


   IMPLEMENTACIÓN WAITMOUSE

MOUSE.MAC  ( a añadir a lo que ya existe)
; Copyright (C) 2013  José Ángel Moneo Fernández

;    This program is free software: you can redistribute it and/or modify
;    it under the terms of the GNU General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;   (at your option) any later version.

;    This program is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU General Public License for more details.

;    You should have received a copy of the GNU General Public License
;    along with this program.  If not, see <http://www.gnu.org/licenses/>.

press=1
release=0

waitmouse macro flanco
ifndef _waitemouse
       extrn  _waitmouse:near
endif

ifb <flanco>
     mov ax,1
else
     mov ax,flanco
endif
     push ax
     call _waitmouse
endm


WMOUSE.ASM
(C) José Angel Moneo Ferdz
include mouse.mac
    public _waitmouse
.modul compact,pascal
.code
proc _waitmouse uses bx,flanco
 espera:
        getmouse                ;lee el estado del raton
        cmp ax,flanco
        jnz actual              ;si no se ha pulsado se espera
        cmp bx,ax               ;si se pulso se verifica si ha sido un
        mov bx,ax               ;flanco de bajada
        jnz  seleccion           ;si es si se selecciona la opción deseada
actual:
        mov bx,ax
        jmp espera
seleccion:
        ret
_waitmouse endp
end




No hay comentarios:

Publicar un comentario

Si tienes algún comentario, duda o sugerencia, o si quieres aportar algún código creado a partir de las librerías expuestas aquí, por favor, indícamelo.