OpenGl glutIdleFunc Анимация - PullRequest
       4

OpenGl glutIdleFunc Анимация

0 голосов
/ 06 октября 2018

Моя проблема

Я все еще изучаю opengl, и я работал над игрой, похожей на куриных захватчиков.Я пытаюсь создать фон, похожий на фон куриных захватчиков с некоторыми звездами и галактикой.Я сделал это с помощью четырехугольника с размером экрана, к которому я добавил текстуру.До сих пор все было хорошо, но я сейчас пытаюсь перевести этот фон галактики вниз, чтобы космический корабль и курица выглядели так, как будто они движутся вперед в пространстве.Моя идея состоит в том, чтобы использовать функцию glutIdleFunc (), и на каждой итерации я должен сначала спать в течение 30 миллисекунд, а затем обновлять фон галактики, чтобы каждая строка пикселей перемещалась вниз на 1 строку, а последняя строка копировалась в первую строку.Проблема в том, что этот подход работает нормально в течение примерно 15 секунд, затем программа полностью останавливается, и мой компьютер зависает и зависает до такой степени, что мне нужно перезагрузить компьютер.Я думаю, что мой подход требует смехотворно большого количества операций каждый раз, когда вызывается glutIdleFunc ().Я искал людей, которые сталкивались с подобными ситуациями в Интернете, но я не нашел подобных сообщений.

код:

основная функция

int main(int argc, char** argr) {
   glutInit(&argc, argr);

   glutInitWindowSize(SCREEN_WIDTH, SCREEN_WIDTH);

   // background is a global variable that contains the bitmap array
   int err = load_image("Art/background.bmp", &background);
   if(err)
   {
       fprintf(stderr, "%d\n", err);
       exit(1); 
   }

   glutCreateWindow("OpenGL - 2D Template");
   glutDisplayFunc(Display);
   glutMotionFunc(mo);
   glutMouseFunc(mou);

   glutIdleFunc(Animate);
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
   glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
   gluOrtho2D(0.0, 1000, 0.0, 600);

   glutMainLoop();
}

Анимация

void Animate(void)
{
    msleep(300);
    translate_image(&background, 30);
    glutPostRedisplay();
}
void translate_image(image_t* img, const int c)
{
    uint32_t copy[img->height][img->width];
    for(int i = 0; i < img->height; i++)
    {
        for(int j = 0; j < img->width; j++)
        {
            copy[i][j] = img->data[i * img->width + j];
        }
    }

    for(int i = 0; i < img->height; i++)
    {
        for(int j = 0; j < img->width; j++)
        {
            int index = (i + c) % img->height;
            img->data[index * img->width + j] = copy[i][j];
        }
    }
}

Функция отображения

void Display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    texture = glInitTexture(background);
    drawImage(texture, 0.0f, 0.0f, background.width, background.height);
    glDisable(GL_TEXTURE_2D);

    drawSpaceShip();


    glFlush();


}

Основной вопрос

Есть ли более эффективный способ сделать то же самое, что я пытаюсь сделать, замораживая компьютер каждый раз, когда я его запускаю?

1 Ответ

0 голосов
/ 06 октября 2018

Вам не нужно копировать содержимое картинки.Достаточно анимировать координаты текстуры, которые вы используете для сопоставления изображения с квадом.

Также вы должны вызвать glutInitDisplayMode до glutCreateWindow, чтобы оно имело эффект.Также вам не нужен единственный буферизованный кадровый буфер, а двойной буферизированный GLUT_DOUBLE вместо GLUT_SINGLE и вызов glutSwapBuffers вместо glFinish.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...