Моя проблема
Я все еще изучаю 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();
}
Основной вопрос
Есть ли более эффективный способ сделать то же самое, что я пытаюсь сделать, замораживая компьютер каждый раз, когда я его запускаю?