Есть ли способ перемещать два квадрата в OpenGL одновременно?
Вопрос
Поэтому у меня есть функция, которая обрабатывает ключевые прессы в игре, на которой я работаю в OpenGL. Но дело в том, что даже если я сделал два квадрата, и они оба двигаются, когда правильный ключ нажимается, только один квадрат перемещается. Есть ли способ сделать два квадрата двигаться. Это функция GlutKeyboardFunc, которую я отвечаю:
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();
}
Если вам нужен еще больше код, просто спросите.
Решение
Отредактировано для комментариев ниже.
// 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()
) и позвоните желаемому поведению. Это имеет несколько преимуществ:
- Ваша обработка ввода клавиатуры объединяется в одном месте.
- С использованием
if
вместоswitch
позволяет использовать несколько клавиш. - Вы можете организовать эту обработку событий внутри вашего основного цикла, а не в зависимости от таймера.
Не связан с StackOverflow