|
发表于 2004-7-24 22:28:53
|
显示全部楼层
在编程时一般需要自己编写合适的读键函数(因为系统不直接提供呗),我前年在作华容道ncurses版参考了svgalib源码而写的,但它并不依赖svgalib和ncurses,代码如下(当然当时为了游戏的需要定义了一些特殊键):
[code:1]
#include <termios.h>
#include <sys/ioctl.h>
#define K_ESC -1
#define K_UP -8
#define K_DOWN -9
#define K_LEFT -10
#define K_RIGHT -11
#define K_ENTER -12
#define K_SPACE -13
#define K_F1 -21
#define K_F2 -22
#define K_F3 -23
#define K_F4 -24
#define K_F5 -25
#define K_UNUSE -111
int vga_getkey(void) /* This function come from source code of */
{ /* svgalib-1.4.3 and nothing modified */
struct termio zap, original;
int e;
char c;
ioctl(fileno(stdin), TCGETA, &original); /* Get termio */
zap = original;
zap.c_cc[VMIN] = 0; /* Modify termio */
zap.c_cc[VTIME] = 0;
zap.c_lflag = 0;
ioctl(fileno(stdin), TCSETA, &zap); /* Set new termio */
e = read(fileno(stdin), &c, 1); /* Read one char */
ioctl(fileno(stdin), TCSETA, &original); /* Restore termio */
if (e != 1)
return 0; /* No key pressed. */
return c; /* Return key. */
}
/*------------------*/
int my_getkey(void)
{
int key;
for(;;){
key=vga_getkey();
if(key!=0)break; /* If no key pressed then continue. */
}
if(key != 0x1b) { /* not ESC */
switch (key) {
case 10:
return K_ENTER; /* ENTER */
case 32:
return K_SPACE; /* Space */
default:
return key; /* 普通键直接返回键值 */
}
}
if((key = vga_getkey()) != '[') {
return K_ESC; /* it was ESC */
}
switch (key = vga_getkey()) {
case 'A':
return K_UP; /* up */
case 'B':
return K_DOWN; /* down */
case 'C':
return K_RIGHT; /* right */
case 'D':
return K_LEFT; /* left */
case '[':
switch (key = vga_getkey()) {
case 'A':
return K_F1;
case 'B':
return K_F2;
case 'C':
return K_F3;
case 'D':
return K_F4;
case 'E':
return K_F5;
default:
return -111;
}
default:
return -111; /* ignore */
}
}
/*------------------*/
[/code:1]
这个函数适合一般输入(这时可以删除掉返回特殊键值如方向键、F1等功能键的语句),也可用于对按键要求比较特殊的游戏。因为游戏中不会一直等待按键,所以没有按键时my_getkey()函数会立即返回,你可以修改它等到有按键输入为止,或者再写个get_char()之类的函数来封装它好了。 |
|