【问题标题】:Tasm KeyPress does not seem to be workingTasm KeyPress 似乎不起作用
【发布时间】:2021-04-17 12:58:45
【问题描述】:

:D 我知道我今天早些时候也发布了另一个关于 Tasm 的问题,但这个问题是关于不同的主题,所以我想发布一个新问题:D。

基本上,我检查一个键是否被按下然后查看它是否是一个 WASD 键的功能似乎不起作用。

代码:

'''proc KeyPress ;function which gets key press from WASD and will change var 'Direction' according to it.
    push ax
    cmp [KeyPressed], 0
    jne EndKeyPress
startofCheck:
    mov ah, 0bh
    int 21h;returns AL=0 - NO KEY PRESSED, AL!=0 - KEY PRESSED.
    cmp al, 0
    je  startofCheck
;PROCESS KEY.        
    mov ah, 0
    int 16h      ;get the key.

Wait_for_Data:
    cmp al, 87;'W'
    je MovingUp
    cmp al, 65;'A'
    je MovingLeft
    cmp al, 83;'S'
    je MovingDown
    cmp al, 68;'D'
    je MovingRight
    jmp startofCheck
MovingUp:
    mov [Direction], 2d
    jmp EndKeyPress
MovingLeft:
    mov [Direction], 3d
    jmp EndKeyPress
MovingDown:
    mov [Direction], 4d
    jmp EndKeyPress
MovingRight:
    mov [Direction], 1d
    jmp EndKeyPress
EndKeyPress:
    inc [KeyPressed]
    pop ax
    ret
endp KeyPress ''' 

我想要做的基本上是检查是否按下了键,如果是,则检查它是否是 WASD。根据按下的键,我会改变蛇的方向。

任何帮助或建议将不胜感激=D

【问题讨论】:

  • 什么不起作用?代码检查循环中是否存在字符,从而阻止执行。您不需要在 ax=0000h/INT 16h 前面使用它,它已经阻塞了。如果你不想阻塞,你需要在没有按键的情况下退出proc。

标签: assembly tasm


【解决方案1】:

如果您需要畅通的按键检查​​,请勿混合使用 DOS 和 Bios 键盘服务。
最好阅读 key-scan code 而不是 ASCII 字符,这样您就不必担心字符大小写(如果 CapsLock 意外打开/关闭)或国家键映射。

Int 16/AH=01hInt 16/AH=00h 的组合最适合您:

startofCheck:
    MOV AH,01h
    INT 16h      ; CHECK FOR KEYSTROKE
    JZ NothingPressed
    MOV AH,00h 
    INT 16h      ; KEYBOARD - GET KEYSTROKE
    CMP AH,11h   ; W
    JE MovingUp
    CMP AH,1Eh   ; A
    JE MovingLeft
    CMP AH,1Fh   ; S
    JE MovingDown
    CMP AH,20h   ; D
    JE MovingRight
    CMP AH,01h   ; Esc
    JE Escape
    JMP EndKeyPress

您的程序的用户可能更喜欢普通的光标箭头,而不是 WASD 键,它们的扫描码分别为向上、向左、向下、向右的扫描码 48h、4Bh、50h、4Dh。

【讨论】:

  • 使用扫描码甚至可以让 OP 不必处理 Dalvik、AZERTY 和其他键盘布局(WASD 不是靠得很近)。但与此同时,它可能会再次咬住 OP,因为具有相同布局(但额外按键)的不同型号键盘可能具有不同的 WASD 扫描码。
  • 非常感谢!我改变了它,现在它就像我想要的那样工作:DDD。我也接受了你的建议,我使用的是移动键而不是 WASD。我可能还有一些奇怪的问题,但现在至少我可以以图形方式测试我的游戏,所以 ty =D
猜你喜欢
  • 2016-11-29
  • 2016-02-01
  • 2020-09-23
  • 2010-12-05
  • 2011-06-14
  • 2015-01-10
  • 2016-02-24
  • 2011-01-18
  • 2018-06-20
相关资源
最近更新 更多