#c #c #multithreading
#c #c #многопоточность #bgi
Вопрос:
Я пишу небольшую игру с мячом. У меня есть вызываемая функция gravity
, и у меня также есть цикл while, который проверяет, хочет ли пользователь перемещать мяч с помощью клавиш wsad.
Нужно ли мне использовать многопоточность или есть другой выход? Я вырезал часть нерелевантного кода для настройки программы. Вот только то, что имеет значение:
while(1) {
enableGravity();
char ch = getch();// i know getch() is not going to cut it
//maybe 2 different f() multi threaded , for gravity and position,
f(ch == 'w' || ch == 'W')
updateObjPosition('U');
else if(ch == 's' || ch == 'S')
updateObjPosition('D');
else if(ch == 'a' || ch == 'A')
updateObjPosition('L');
else if(ch == 'd' || ch == 'D')
updateObjPosition('R');
}
У меня есть эти функции в main. Мне нужна программа, чтобы включить гравитацию, а также иметь возможность принимать входные данные для updateObjPosition()
одновременного перемещения мяча.
Комментарии:
1. Вы, вероятно, ищете функцию kbhit.
2. Вы, вероятно, не хотите делать «маленькую игру» многопоточной. Это сложно.
Ответ №1:
Вы могли бы использовать несколько потоков. Более очевидной возможностью было бы неблокирующее чтение с клавиатуры.
Если вы делаете это в Windows, у вас, вероятно, есть _kbhit
в вашей стандартной библиотеке, которая сообщит вам, была ли нажата клавиша на клавиатуре. Если вы используете curses , вы можете использовать nodelay
, чтобы сообщить getch, чтобы он немедленно возвращался, независимо от того, была нажата клавиша или нет. Другие системы все еще могут делать что-то по-разному, но общую идею вы уловили…
Ответ №2:
Вам не нужно многопоточность. Вам просто нужен API, который возвращает TRUE, если в данный момент нажата указанная клавиша. Это, вероятно, будет зависеть от платформы. На какой платформе вы создаете / работаете?
Например, в Win32: GetAsyncKeyState
Комментарии:
1. windows, но скомпилированная программа представляет собой приложение консольного типа (извините, я новичок в c )
2. Иисус не имеет к этому никакого отношения … в Windows это так
_kbhit
, так что это все еще зависит от платформы.3. @DanielEarwicker он использует TC 3.1, windows.h не существовал в то время? я думаю! , Даже я согласен, что GetAsyncKeyState в 100 раз лучше, чем _kbhit решение: P
Ответ №3:
Как вы уже упоминали, вы используете старый компилятор Borland на TC 3.1, в старом conio.h была функция
kbhit();
функция была одноразовым решением для получения, если на клавиатуре нажата какая-либо клавиша
, так что вот ваш цикл для ввода ключа
int getKey(){
if(kbhit){
return getch();
}
return -1;
}
Кстати, вам следует перейти по крайней мере на VC 08!
Для вашего простого проекта, где логический цикл, я думаю, будет довольно маленьким, это поможет вам справиться со всей болью, но если вы пишете более длинное приложение с жесткой логикой, тогда вам придется использовать лучшие и асинхронные методы для ввода-вывода, и эти методы в основном включают работу с 2 потоками: 1 получает ввод, а другой выполняетлогические операции ..