2016-06-13 6 views
2

Я работаю над проектом сборки с TASM, DosBox и Notepad ++. Я рисую точку на экране, и мне нужно знать, щелкнул ли пользователь ее (правая мышь). Я попытался проверить, щелкнул ли пользователь правой кнопкой мыши, а затем, если координаты клика совпадают с координатами точки.
По какой-то причине он не работает. Вот мой прок:Вход мыши TASM

proc SetCursor 

;initialize the mouse 

mov ax, 0h 

int 33h 

;show mouse 

mov ax, 1h 

int 33h 

; get mouse place and status 

mov ax, 3h 

int 33h 

ret 

endp SetCursor 

Здесь я называю это:

DotGame: 
;enter graphics mode 
mov ax, 13h 
int 10h 
call SetCursor ; mouse input 
call DotOne 

cmp bx, 01 ; check if left mouse was clicked 
je Check_X_Cords 
;check if the player clicked the dot cords 

Check_X_Cords: 
cmp cx, [XCords1] 
je Check_Y_Cords 

Check_Y_Cords: 
cmp dx, [YCords1] 
je ScoreLabel 

ScoreLabel: 
inc [score] 

Программа просто прыгает между этикетками, это не имеет значения, если координаты являются одинаковыми или нет.

+1

Предполагая, что вызов 'DotOne' не уничтожает' bx', служба 'Int 33/AX = 0003h' возвращает ** текущую позицию ** и состояние кнопок. Может быть вас больше всего интересует 'Int 33/AX = 0005h'? Или, может быть, 'Int 33/AX = 000ch' для подхода, управляемого прерываниями? –

ответ

1

Ваш код имеет некоторые проблемы:

  • proc SetCursor не INIT мышь и получить позицию одновременно.
  • je Check_X_Cords нуждается в другом прыжке в случае, если он не равен. То же самое для je Check_Y_Cords
  • Как @MargaretBloom сказал, возможно, что call DotOne уничтожает BX.

Существует много кода не хватает, так что я должен был добавить его, чтобы проверить его:

  • Добавлены переменные х, у, чтобы сохранить позицию мыши.
  • Отображает координаты, чтобы проверить, на что мы нажимаем.
  • Отображает «оценку!». при нажатии на пиксель.

Вот код, он работает и правильно определяет правую кнопку мыши на пикселе (щелчок левой кнопкой мыши игнорируется, но вы можете изменить его), комментарии помогут вам понять:

.model small 
.stack 100h 
.data 
    XCords1 dw 160  ;COORDS OF PIXEL AT 
    YCords1 dw 100  ;SCREEN CENTER. 
    score dw 0 
    x  dw ?   ;MOUSE CLICK X. 
    y  dw ?   ;MOUSE CLICK Y. 
    msj  db 'score!$' 
    hyphen db '-$' 
    clear db '  $' ;CLEAR LINE. 
    numstr db '$$$$$' ;STRING FOR 4 DIGITS. 
.code 
mov ax, @data 
mov ds, ax 

;DotGame: 
;enter graphics mode 
mov ax, 13h 
int 10h 
call SetCursor ; mouse input 
call DotOne 

DotGame: 
mov bx, 1   ;CHECK RIGHT BUTTON (USE 0 TO CHECK LEFT BUTTON). 
call GetMouseState 
and bx, 00000010b ;CHECK SECOND BIT (BIT 1). 
jz DotGame  ;NO RIGHT CLICK. REPEAT. 

mov x, cx   ;PRESERVE X AND Y BECAUSE 
mov y, dx   ;CX DX WILL BE DESTROYED.     
call display_coords 

;cmp bx, 01 ; check if left mouse was clicked 
;je Check_X_Cords 
;check if the player clicked the dot cords 

Check_X_Cords: 
mov cx, x 
cmp cx, XCords1 
je Check_Y_Cords 

jmp DotGame  ;WRONG COLUMN. REPEAT. 

Check_Y_Cords: 
mov dx, y 
cmp dx, YCords1 
je ScoreLabel 

jmp DotGame  ;WRONG ROW. REPEAT. 

ScoreLabel: 
inc [score]    
;DISPLAY "SCORE!". 
    mov ah, 9 
    mov dx, offset msj 
    int 21h 
jmp DotGame  ;REPEAT. 

mov ax, 4c00h 
int 21h 

;---------------------------------------    

    proc SetCursor 

;initialize the mouse 

mov ax, 0h 

int 33h 

;show mouse 

mov ax, 1h 

int 33h 

; get mouse place and status 

;mov ax, 3h 

;int 33h 

ret 

    endp SetCursor 

;---------------------------------------    
;DRAW ONE PIXEL AT XCORDS1,YCORDS1. 
proc DotOne 
    mov ah, 0ch  ;SERVICE TO DRAW PIXEL. 
    mov al, 14  ;YELLOW. 
    mov bh, 0   ;VIDEO PAGE. 
    mov cx, XCords1 
    mov dx, YCords1 
    int 10h   ;BIOS SCREEN SERVICES. 
    ret 
endp DotOne 
;---------------------------------------    
;GET MOUSE CURSOR STATE. 
;RETURN : BX : BIT 0 = 0 : LEFT BUTTON PRESSED. 
;     = 1 : LEFT BUTTON RELEASED. 
;   : BIT 1 = 0 : RIGHT BUTTON PRESSED. 
;     = 1 : RIGHT BUTTON RELEASED. 
;   CX = SCREEN COLUMN. 
;   DX = SCREEN ROW. 

proc GetMouseState 
    mov ax, 3  ;SERVICE TO GET MOUSE STATE. 
    int 33h 
    ret 
endp GetMouseState 

;------------------------------------------ 
;CONVERT A NUMBER IN STRING. 
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE 
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE 
;ORDER TO CONSTRUCT STRING (STR). 
;PARAMETERS : AX = NUMBER TO CONVERT. 
;    SI = POINTING WHERE TO STORE STRING. 
;DESTROYED : AX, BX, CX, DX, SI. 

number2string proc 
    call dollars ;FILL STRING WITH $. 
    mov bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10. 
    mov cx, 0 ;COUNTER FOR EXTRACTED DIGITS. 
cycle1:  
    mov dx, 0 ;NECESSARY TO DIVIDE BY BX. 
    div bx  ;DX:AX/10 = AX:QUOTIENT DX:REMAINDER. 
    push dx  ;PRESERVE DIGIT EXTRACTED FOR LATER. 
    inc cx  ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED. 
    cmp ax, 0 ;IF NUMBER IS 
    jne cycle1 ;NOT ZERO, LOOP. 
;NOW RETRIEVE PUSHED DIGITS. 
cycle2: 
    pop dx   
    add dl, 48 ;CONVERT DIGIT TO CHARACTER. 
    mov [ si ], dl 
    inc si 
    loop cycle2 

    ret 
number2string endp  

;------------------------------------------ 
;FILLS VARIABLE "NUMSTR" WITH '$'. 
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE 
;THE STRING WILL BE DISPLAYED. 
;PARAMETER : SI = POINTING TO STRING TO FILL. 
;DESTROYED : BL, CX, DI. 

proc dollars     
    mov cx, 5 
    mov di, offset numstr 
dollars_loop:  
    mov bl, '$' 
    mov [ di ], bl 
    inc di 
    loop dollars_loop 

    ret 
endp    

;------------------------------------------ 

proc display_coords 
;SEND CURSOR TO START OF UPPER LEFT. 
    mov ah, 2 ;SERVICE TO SET CURSOR POSITION. 
    mov bh, 0 ;VIDE PAGE. 
    mov dl, 0 ;X. 
    mov dh, 0 ;Y. 
    int 10h 
;CLEAR LINE. 
    mov ah, 9 
    mov dx, offset clear 
    int 21h 
;SEND CURSOR TO START OF UPPER LEFT. 
    mov ah, 2 ;SERVICE TO SET CURSOR POSITION. 
    mov bh, 0 ;VIDE PAGE. 
    mov dl, 0 ;X. 
    mov dh, 0 ;Y. 
    int 10h 
;CONVERT X TO STRING. 
    mov ax, x ;AX = PARAMETER FOR NUMBER2STRING.            
    mov si, offset numstr 
    call number2string            
;DISPLAY X. 
    mov ah, 9 
    mov dx, offset numstr 
    int 21h 
;"-". 
    mov ah, 9 
    mov dx, offset hyphen 
    int 21h 
;CONVERT Y TO STRING. 
    mov ax, y ;AX = PARAMETER FOR NUMBER2STRING.            
    mov si, offset numstr 
    call number2string            
;DISPLAY Y. 
    mov ah, 9 
    mov dx, offset numstr 
    int 21h   
    ret 
endp display_coords 

 Смежные вопросы

  • Нет связанных вопросов^_^