回 帖 发 新 帖 刷新版面

主题:[求助]关于键盘按键

问题 1
玩过 泡泡堂 的人都知道 :进行泡泡堂游戏时,通过方向键及空格键控制游戏人物的运动,而且方向键与空格键互无干扰,请问如何实现?

问题 2
按下一个按键时,产生按压码(它可以用INKEY$检测到),当释放这个按键时,产生一个释放码,请问这个释放码有没有办法检测到?

回复列表 (共13个回复)

沙发

我也想不通怎么能够互不干扰,可能是时间差极小,感觉不到吧?如果有可能在特别慢的机器上运行,不知道能否看出来。

板凳

问题1和问题2实际是一个问题!
用INKEY¥是无法实现你想的效果的!
另外,我已经把菜单教程的原程序修改了!你在是是看!

3 楼

问题1是多线程的
问题2有一个DOS的中断可以实现,我去查,查到再贴上去

4 楼

可以用inp(&H60)读释放码
do
a = inp(&H60)
a = a and 128 '最高位是128,是128表示键已放开
loop until a=128'没有键按下或键已放开 退出循环

5 楼

这样还是不行[em10][em10][em10]
DECLARE SUB you ()
DO
  k$ = INKEY$: IF k$ <> "" THEN EXIT DO
LOOP
PRINT k$
CALL you

SUB you
DO
  LOCATE 12,20:PRINT TIMER
  a = INP(&H60)
  a = a AND 128
LOOP UNTIL a = 128
END SUB
按下一个按键后,在按其它按键时程序就结束了,也就达不到同时检测两个按键的要求。

6 楼

en

7 楼

把你的改了下
DECLARE SUB you ()
DIM SHARED k
DO
  k$ = INKEY$
  IF k$ <> "" THEN
    k = INP(&H60)
    EXIT DO
  END IF
LOOP
PRINT k$
CALL you

SUB you
DO
  LOCATE 12, 20: PRINT TIMER
  a = INP(&H60)
LOOP UNTIL a = (k OR 128)
END SUB

8 楼

问题1和问题2实际是一个问题!
用INKEY¥是无法实现你想的效果的!
可以用inp(&H60)读按下与释放码,下面是我写的一小段程序,只用了左键和空白键,别的自己去弄,我只是提供思路!
CLS
COLOR 13
LOCATE 4, 3: PRINT "KEY CODE= "
DO
  KeyDown = INP(&H60)  '获得键盘状态
  LOCATE 4, 12: PRINT KeyDown
  SELECT CASE KeyDown
           CASE 57   '按下空格
                COLOR 2: LOCATE 5, 3: PRINT "KEY =SPANE ,DOWN": COLOR 13
           CASE 57 + 128 '放开空格
                COLOR 2: LOCATE 5, 3: PRINT "KEY =SPANE ,UP  ": COLOR 13
           CASE 75   '按下方向左键
                COLOR 3: LOCATE 6, 3: PRINT "KEY =LEFT ,DOWN": COLOR 13
           CASE 170, 203'放开左键
                COLOR 3: LOCATE 6, 3: PRINT "KEY =LEFT ,UP  ": COLOR 13
  END SELECT
LOOP UNTIL INKEY$ = CHR$(27)
这个程序的关键是用释放来判断,如果你的键按下后没有释放,你又按下了另一个键,它不会有释放码的!CASE 170, 203'放开左键这个是考虑的扩展键盘上的小键盘
希望能对你有帮助

9 楼

我写了下面的程序用来分析INP(&H60)的返回值,应该是“扫描码”;但是按诸如 上 下 左 右  delete end等时会出现特殊情况,楼上qb45的帖子中的CASE 170,203就反映了这个情况,请求解释[em18]
按 Ctrl+Break 退出
CLS
DO
  key$ = INKEY$:keylen = LEN(key$)
  IF keylen = 1 THEN
    key$ = "  " + key$
  ELSEIF keylen = 2 THEN
    key$ = " 0" + RIGHT$(key$, 1)
  END IF
  
  inp60 = INP(&H60): inp61 = INP(&H61)
  IF inp60 < 128 THEN
    LOCATE 10, 19: PRINT inp60; "+"; 128; "="; inp60 + 128
  END IF
  
  LOCATE 11, 20: PRINT "KeyPress ="; key$
  LOCATE 12, 20: PRINT "INP(&H60)="; inp60
  LOCATE 13, 20: PRINT "INP(&H61)="; inp61
LOOP

10 楼

在qb45的程序的基础上,经过改进,终于 成功了!!
CLS
COLOR 4
LOCATE 4, 3: PRINT "KEY CODE= "
DO
  KeyDown = INP(&H60)
  LOCATE 4, 12: PRINT KeyDown
  SELECT CASE KeyDown
    CASE 57
      LOCATE 10, 3: PRINT "KEY =SPACE,DOWN"
    CASE 57 + 128
      LOCATE 10, 3: PRINT "KEY =SPACE,UP  "
    CASE 72
      LOCATE 8, 40: PRINT "KEY =up   ,DOWN"
    CASE 200
      LOCATE 8, 40: PRINT "KEY =up   ,UP  "
    CASE 75
      LOCATE 10, 23: PRINT "KEY =left ,DOWN"
    CASE 203
      LOCATE 10, 23: PRINT "KEY =left ,UP  "
    CASE 77
      LOCATE 10, 57: PRINT "KEY =right,DOWN"
    CASE 205
      LOCATE 10, 57: PRINT "KEY =right,UP  "
    CASE 80
      LOCATE 10, 40: PRINT "KEY =down ,DOWN"
    CASE 208
      LOCATE 10, 40: PRINT "KEY =down ,UP  "
    CASE 1  'ESC
      EXIT DO
  END SELECT
LOOP

我来回复

您尚未登录,请登录后再回复。点此登录或注册