Пиксели перемещаются, когда инициализируются самостоятельно, но не в цикле? - PullRequest
0 голосов
/ 15 февраля 2019

Я работаю с 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нарисовано, оно движется, как и ожидалось.

1 Ответ

0 голосов
/ 15 февраля 2019

Вы звоните move() на копии каждого Drop, который ограничен только для одной итерации цикла

. Вы можете использовать

//---------
//        |
//        v
for (Drop &a : listDrops) {
        glColor3f(255,255,255); // white
        glVertex2i(a.getPosX(),a.getPosY());
        a.move();
}

, чтобы взять Drop sпо ссылке

То, что вы делали ранее, было эквивалентно

for (int i=0; i<listDrops.size();++i) {
    Drop a = listDrops[i]; //a is a copy of the entry
    assert(&a != &listDrops[i])
    //...
}
...