Я пытаюсь сделать игру, которая продолжает работать до тех пор, пока не будет нажата клавиша, а затем она должна взять этот ключ и что-то сделать с ним, а затем продолжить работать как обычно. Как мне это сделать?
Я на MAC, так что, хотя я столкнулся с библиотекой окон, называемой conio.h, которая может справиться с этим с помощью kbhit () и getch (), я не могу заставить это работать для меня …
// // main.c // conioTesting // // #include #include "myconio_mac.h" int main(int argc, const char * argv[]) { int counter = 0; while (counter < 2) { if (kbhit()) { char key = getch(); printf("\n Key is %c \n", key); printf("Keyboard hit detected \n"); } else { printf("Nothing. \n"); } } printf("Passed!!!!!!!!!! \n"); }
На MAC вы должны возиться с настройками терминала, чтобы отключить буферизацию строк. (Вы также можете отключить эхо.) Как только терминал настроен правильно, вы можете использовать read
для получения отдельных символов с клавиатуры.
В приведенном ниже примере кода функция kbsetup
выполняет настройки терминала. Функция getkey
проверяет нажатие клавиши и возвращает ключ, если он есть, или '\0'
если не было прочитано ни одной клавиши. main
функция имеет цикл, который печатает время один раз в секунду и печатает любую клавишу, которую пользователь нажимает. Нажмите 'q'
чтобы выйти из программы.
#include #include #include #include #include #include static struct termios oldSettings; void kbcleanup( void ) { tcsetattr( 0, TCSAFLUSH, &oldSettings ); /* restore old settings */ } void kbsetup( void ) { tcgetattr( 0, &oldSettings ); struct termios newSettings = oldSettings; newSettings.c_lflag &= ~ICANON; /* disable line-at-a-time input */ newSettings.c_lflag &= ~ECHO; /* disable echo */ newSettings.c_cc[VMIN] = 0; /* don't wait for characters */ newSettings.c_cc[VTIME] = 0; /* no minimum wait time */ if ( tcsetattr( 0, TCSAFLUSH, &newSettings ) == 0 ){ atexit( kbcleanup ); /* restore the terminal settings when the program exits */ } else { fprintf( stderr, "Unable to set terminal mode\n" ); exit( 1 ); } } int getkey( void ) { char c; if ( read( STDIN_FILENO, &c, 1 ) == 0 ) return '\0'; else return c; } int main( void ) { int c; kbsetup(); time_t start = time( NULL ); time_t previous = start; for (;;) { usleep( 1000 ); time_t current = time( NULL ); if ( current != previous ) { fprintf( stderr, "tick %3ld\r", current - start ); previous = current; } else if ( (c = getkey()) != '\0' ) { if ( c == 'q' || c == 'Q' ) break; printf( "\ngot char: 0x%02x", c ); if ( isprint( c ) ) printf( " '%c'", c ); printf( "\n" ); } } }
Похоже, вы хотите дождаться нажатия клавиши, а затем продолжить выполнение:
//test.c #include #include void *input_listener(void *threadarg) { getchar(); printf("A key was pressed.\n"); } int main() { printf("Start\n"); pthread_t thread; pthread_create(&thread, NULL, input_listener, NULL); pthread_join(thread, NULL); // Continue main }
Должно быть очень просто сделать с pthreads (необходимо скомпилировать: gcc test.c -lpthread
).
Вы можете проверить ответы, упомянутые в другой статье stackoverflow:
Проблема с kbhit () [и getch ()] для Linux