Я работаю с OpenGL / Glut и пытаюсь создать простой эффект «дождя».У меня есть класс для капель дождя:
class Drop {
private:
int speed;
int posY;
int posX;
public:
Drop() { // constructor
speed = 5;
posY = 15;
posX = (rand() % 500);
}
void move() {
speed += 1;
posY += speed;
}
int getPosY() {
return posY;
}
int getPosX() {
return posX;
}
};
Список Drop
с рядом с функцией, чтобы добавить Drop
с в список.
list<Drop> listDrops;
void placeDrop() {
Drop d = Drop();
listDrops.push_back(d);
}
Функция для перерисовкиОкно OpenGL:
void refreshDisplay() {
if (rand() % 5 == 1) {
placeDrop();
}
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(5);
glBegin(GL_POINTS);
for (Drop a : listDrops) {
glColor3f(255,255,255); // white
glVertex2i(a.getPosX(),a.getPosY());
a.move();
}
glEnd();
glFlush();
glutSwapBuffers();
}
void repeater(int val) {
glutPostRedisplay();
glutTimerFunc(5, repeater, 0);
}
И, конечно, мой основной и Glut init:
int main(int argc, char** argv) {
srand(time(NULL));
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowSize(500, 500);
glutCreateWindow("Rain");
gluOrtho2D(0.0, 500.0, 500.0, 0.0);
glutDisplayFunc(refreshDisplay);
glutTimerFunc(0, repeater, 0);
glutMainLoop();
return 0;
}
Все Drop
правильно инициализированы, я могу подтвердить, выдав их координатыпосле создания.Но они не двигаются вообще.Это как Drop::move()
игнорируется.
Если я вместо этого инициализирую глобальный Drop aDrop
(только один) и избавляюсь от итератора над listDrops
в refreshDisplay()
и вместо этого просто aDrop
нарисовано, оно движется, как и ожидалось.