Как читать несколько клавиатурных вводов от пользователя одновременно?
Я строю понг и хочу получить информацию от двух пользователей для перемещения ракеток, но когда я использую int 16h ah1 (и ah0, чтобы определить, была ли нажата клавиша wt все), он перемещает по одному символу за раз.
Я нашел некоторые решения, но, поскольку я не являюсь носителем английского языка, я не мог их понять.
1 ответ
Int 16/AH=01h используется для проверки нажатия клавиши.
В то время как Int 16/AH=00h используется для получения нажатия клавиши.
Обратите внимание, что вы получили их наоборот.
Здесь очень простая программа, которая опрашивает нажатия клавиш A, D и Q.
Увеличивает игрока 1 синий символ в строке 1.
D увеличивает игрока 2 красным персонажем в строке 2.
Q выходит из программы.
Если вы нажмете A и D вместе, оба символа будут увеличены.
Он использует простую таблицу поиска для отправки ключа своему обработчику, чтобы избежать спагетти-кода, когда в программе много функций.
Используйте тот способ диспетчеризации, который больше соответствует вашим потребностям, а общее эффективное решение выходит за рамки этого вопроса.
BITS 16
ORG 100h
mov ax, 0003h
int 10h ;Set a known screen mode
mov ax, 0b800h
mov es, ax ;Set ES to access textual video buffer
;Write two 'A's (Blue and red)
mov WORD [es:0000h], 0941h
mov WORD [es:160], 0c41h
;We need BH zero for later
xor bx, bx
_poll_key:
;CHECK FOR A KEY
mov ah, 01h
int 16h
jz _poll_key
;REMOVE THE KEY FROM THE BUFFER
xor ah, ah
int 16h
mov bl, al
call dispatch_key
jmp _poll_key
;
; D I S P A T C H E R
;
;BX = Key to dispatch
dispatch_key:
push bx
sub bx, 'a'
jb _dk_end
cmp bx, 26
jae _dk_end
shl bx, 1
mov bx, WORD [dispatch_table + bx]
test bx, bx
jz _dk_end
call bx
_dk_end:
pop bx
ret
dispatch_table:
;A
dw _key_a
;B
dw 0
;C
dw 0
;D
dw _key_d
;E
dw 0
;F
dw 0
;G
dw 0
;H
dw 0
;I
dw 0
;J
dw 0
;K
dw 0
;L
dw 0
;M
dw 0
;N
dw 0
;O
dw 0
;P
dw 0
;Q
dw _key_q
;R
dw 0
;S
dw 0
;T
dw 0
;U
dw 0
;V
dw 0
;W
dw 0
;X
dw 0
;Y
dw 0
;Z
dw 0
;
; K E Y H A N D L E R S
;
;EXIT
_key_q:
mov ax, 4c00h
int 21h
;INCREMENT PLAYER 2 LETTER
_key_d:
inc BYTE [es:160]
ret
;INCREMENT PLAYER 1 LETTER
_key_a:
inc BYTE [es:0000h]
ret
Код для NASM, для создания файла COM.