2010-05-10 3 views
1

поэтому у меня есть функция, которая обрабатывает нажатия клавиш в игре, над которой я работаю в OpenGL. Но дело в том, что хотя я сделал два квадрата, и они оба двигаются, когда нажата правильная клавиша, только один квадрат перемещается. Есть ли способ, которым я могу заставить два квадрата двигаться. Это функция glutKeyboardFunc, которую я импонировал:Есть ли способ переместить два квадрата в OpenGL одновременно?

void handleKeypress(unsigned char key, int x, int y) 
{ 
     if (key == 'w') 
     { 
      for (int i = 0; i < 12; i++) 
      { 
       if (i == 1 || i == 7 || i == 10 || i == 4) 
       { 
        square[i] = square[i] + 0.1; 
       } 
      } 
     } 
     if (key == 'd') 
     { 
      for (int i = 0; i < 12; i++) 
      { 
       if (i == 0 || i % 3 == 0) 
       { 
        square[i] = square[i] + 0.1; 
       } 
      } 
     } 
    if (key == 's') 
    { 
     for (int i = 0; i < 12; i++) 
     { 
      if (i == 1 || i == 7 || i == 10 || i == 4) 
      { 
       square[i] = square[i] - 0.1; 
      } 
     } 
    } 
     if (key == 'a') 
     { 
      for (int i = 0; i < 12; i++) 
      { 
       if (i == 0 || i % 3 == 0) 
       { 
        square[i] = square[i] - 0.1; 
       } 
      } 
     } 
    glutPostRedisplay(); 
} 

Если вам нужен еще один код, просто спросите.

+0

Каковы значения параметров glutTimerFunc? – Himadri

+0

'glutTimerFunc()' принимает время в ms для вызова функции, а третье значение передается в функцию. В этом случае OP передает 0,001 мс в функцию ... что не имеет смысла. Кроме того, этот проект имеет потенциал для создания проблем гоночных условий. –

+0

У меня был glutTimerfunc() только потому, что у меня были проблемы с плавными переходами (квадрат вскочил), который не работал в любом случае ... поэтому я вытащу glutTimerFunc() в своем новом коде. – 2010-05-10 22:42:59

ответ

1

Отредактировано для комментариев ниже.

// I'm making some assumptions about your functions here. Make adjustments. 
// You can handle both players' key inputs here. 
void handleKeypress(unsigned char key, int x, int y) 
{ 
    if (key == 27) 
     exit(0); 

    // Player 1 
    if (key == 'w') 
    { 
     A.moveSquareUp(); 
    } 
    if (key == 'd') 
    { 
     A.moveSquareRight(); 
    } 
    if (key == 's') 
    { 
     A.moveSquareDown(); 
    } 
    if (key == 'a') 
    { 
     A.moveSquareLeft(); 
    } 
} 

void handleSpecialKeypress(int key, int x, int y) 
{ 
    // Player 2 
    if (key == GLUT_KEY_UP) 
    { 
     B.moveSquareUp(); 
    } 
    if (key == GLUT_KEY_RIGHT) 
    { 
     B.moveSquareRight(); 
    } 
    if (key == GLUT_KEY_DOWN) 
    { 
     B.moveSquareDown(); 
    } 
    if (key == GLUT_KEY_LEFT) 
    { 
     B.moveSquareLeft(); 
    } 
} 

Вы должны обрабатывать ваши события клавиатуры где-то в вашей игровой логики (основной цикл, или обратного вызова из glutKeyboardFunc()), и вызывать желаемое поведение. Это имеет некоторые преимущества:

  1. Ваша клавиатура ввода данных унифицирована в одном месте.
  2. Использование if вместо switch позволяет использовать несколько ключей.
  3. Вы можете организовать эту обработку событий внутри основного контура, а не в зависимости от таймера.
+0

Спасибо за помощь, но проблема в том, что я хочу, чтобы два игрока могли перемещаться сразу, например, один человек нажимает клавишу со стрелкой вверх, перемещаясь на один квадрат, а другой человек нажимает «а», что эквивалентно перемещению влево. – 2010-05-10 22:41:22

+0

Прямо сейчас. Позвольте мне изменить свой примерный код, чтобы отразить, что вы будете делать. || Отредактировано сейчас. Пожалуйста, посмотрите еще раз, тигр. ':]' –

+0

@ Xavier Ho: Я перепробовал сегмент своего кода (только для игрока), но у меня все еще возникают две проблемы: скажем, игрок один нажимает «как», он должен двигаться влево и вниз почти одновременно, но он не делает, t plus GLUT_KEY_ * (звезда указывает любой из этих 4-х ключей) не работает на моем компьютере по какой-то нечетной причине. – 2010-05-11 23:07:29

Смежные вопросы