При использовании glut, у вас действительно нет другого выбора, кроме как использовать глобальные переменные. Какая-то отстой, но у тебя это есть. Если вы действительно хотите, вы можете упаковать переменные в класс, что-то вроде этого ...
class MyGame
{
public:
MyGame(int argc, char* argv[])
{
assert(g_game);
glutInit(&argc, argv);
// do all the usual glutCreateWindow / glutInitDisplayMode stuff here
// attach to the static glut_draw method (which will call draw)
glutDisplayFunc(glut_draw);
glutMainLoop();
}
void draw();
private:
/* put your data here */
private:
static MyGame* g_game; //< a single global pointer to your game
static void glut_draw();
};
MyGame* MyGame::g_game = 0;
MyGame::MyGame(int argc, char* argv[])
{
assert(g_game);
glutInit(&argc, argv);
/* do all the usual glutCreateWindow / glutInitDisplayMode stuff here */
// attach the
glutDisplayFunc(glut_draw);
glutMainLoop();
}
// use this static method to thunk into the member function draw()
void MyGame::glut_draw()
{
g_game->draw();
}
void MyGame::draw()
{
glClear(GL_COLOR_BUFFER_BIT);
// you now have access to all the member variables of the MyGame class.
glutSwapBuffers();
}
Для бонусных баллов вы можете объявить draw () как виртуальный и скрыть все перенасыщение в базовом классе.