Небольшая игра на c с использованием graphics.h, вызывающая сразу несколько функций? (многопоточность?)

#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:

Комментарии:

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 получает ввод, а другой выполняетлогические операции ..