主题:[求助]关于键盘按键
飞鸟12
[专家分:2830] 发布于 2005-02-18 11:42:00
问题 1
玩过 泡泡堂 的人都知道 :进行泡泡堂游戏时,通过方向键及空格键控制游戏人物的运动,而且方向键与空格键互无干扰,请问如何实现?
问题 2
按下一个按键时,产生按压码(它可以用INKEY$检测到),当释放这个按键时,产生一个释放码,请问这个释放码有没有办法检测到?
回复列表 (共13个回复)
沙发
staa [专家分:3690] 发布于 2005-02-18 13:38:00
我也想不通怎么能够互不干扰,可能是时间差极小,感觉不到吧?如果有可能在特别慢的机器上运行,不知道能否看出来。
板凳
qb45 [专家分:2880] 发布于 2005-02-18 15:50:00
问题1和问题2实际是一个问题!
用INKEY¥是无法实现你想的效果的!
另外,我已经把菜单教程的原程序修改了!你在是是看!
3 楼
QB71 [专家分:1300] 发布于 2005-02-18 16:29:00
问题1是多线程的
问题2有一个DOS的中断可以实现,我去查,查到再贴上去
4 楼
ahei [专家分:150] 发布于 2005-02-24 09:06:00
可以用inp(&H60)读释放码
do
a = inp(&H60)
a = a and 128 '最高位是128,是128表示键已放开
loop until a=128'没有键按下或键已放开 退出循环
5 楼
飞鸟12 [专家分:2830] 发布于 2005-02-24 12:38:00
这样还是不行[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 楼
netking [专家分:40] 发布于 2005-02-27 10:57:00
en
7 楼
codepk [专家分:2800] 发布于 2005-02-27 19:40:00
把你的改了下
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 楼
qb45 [专家分:2880] 发布于 2005-02-28 10:46:00
问题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 楼
飞鸟12 [专家分:2830] 发布于 2005-02-28 13:14:00
我写了下面的程序用来分析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 楼
飞鸟12 [专家分:2830] 发布于 2005-02-28 15:06:00
在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
我来回复