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.