OpenGL перезапустить сцену

0

У меня проблема с игрой, которую я разработал для класса.

Цель заключалась в том, чтобы сделать игру: вы можете убить квадрат и в конце показать максимальный балл и максимальную скорость, но я также хочу, чтобы игра возобновилась, когда игрок нажимает клавишу R, но я не могу понять, как чтобы заставить opengl перезапустить всю сцену.

Вот код:

HandleKeyboardFunction, когда R нажата, мы хотим перезапустить игру

void HandleKeyboard(unsigned char key, int x, int y)
{
    switch (key) 
    {

        //Sai quando pressionado Qq
        case 113: //q
        case 81: //Q
            exit(0);
            break;
        case 82: //R
        case 114: //r
            LIFE=3;
            SCORE=0;
            Respawn();
            SetupRC();
            Text();
            break;
    }
    glutPostRedisplay();
}

TIMERFUNCTION переместить мою площадь

void TimerFunction(int value)
{
        GLfloat velocidade;

        //Controlo do tempo
        t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
        int time = (int)t;

        //Reverter direção quando a Formiga tocar nas laterais
        if(x1 > windowWidth-rsize || x1 < 0)
            xstep = -xstep;     

        //Reajustamento, no caso de a janela mudar de dimensões.
        if(x1 > windowWidth-rsize)
            x1 = windowWidth-rsize-1;       
        if(y1 > windowHeight-rsize)
            y1 = windowHeight-rsize-1;

        //Mover a "Formiga" aleatoriamente

            Random();

        //Se a "Formiga" fugir, o jogador perde 1 vida.
        if(y1 < -15)
        {
            LIFE--;
            //Quando o jogador perde 1 vida, a velocidade inicial é reestabelecida, assim como o SCORE.
                //*
                xstep = 2.0f; 
                ystep = 2.0f;
                //*
            SCORE=0;
            I=50;
            Respawn();
            num=rand() % 4; //Vai alterar a direção da "formiga" aleatoriamente 
        }

        //O Jogo termina quando acabarem as vidas ao jogador
        if(LIFE<0) 
        {
            glClearColor(1.0f,1.0f,1.0f,1.0f);
            sprintf(gameover, "GAME OVER!!!"); //MENSAGEM DE FIM DE JOGO
            sprintf(resultado,"MAX SCORE: %d | VEL MAX: %.2f ",highscore, max);
            sprintf(menu,"(q) - Sair | (r) - Repetir");
            glutKeyboardFunc(HandleKeyboard);
        }
        else
        {
            glutTimerFunc(33,TimerFunction, 1);
        }

        //Mostra no ecrã, o SCORE, a VIDA e o TEMPO do jogo.
        sprintf(sl, "SCORE : %d | LIFE: %d | TIME: %2d Sec | MAX SCORE: %d ", SCORE, LIFE, time, highscore);

        //Vamos garantir que o jogador ve sempre a velocidade positiva 
            //*
            if(xstep>ystep) 
            { 
                if(xstep<0){velocidade=-xstep;} else {velocidade=xstep;}
            }
                else { if(ystep<0){velocidade=-ystep;} else {velocidade=ystep;}
            }
            //*


        sprintf(vel,"VEL: %.2f ",velocidade); //Mostra a velocidade da "formiga"
        if(velocidade>max){max=velocidade;} //
        if(SCORE>highscore){highscore=SCORE;}; //Garantir que no final é mostrada a melhor pontuação do jogo
        glutPostRedisplay();
    }

ГЛАВНЫЙ

//Main program entry point
int main(void){

            glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
            glutInitWindowSize(640,480);
            glutCreateWindow("ESMAGA FORMIGA");
            glutDisplayFunc(RenderScene);
            glutReshapeFunc(ChangeSize);
            glutTimerFunc(33, TimerFunction, 1);
            glutMouseFunc(mouseClick);
            SetupRC();
            glutMainLoop(); //Frame by frame
}
  • 0
    main должен вернуть int . Также я бы порекомендовал вам удалить из вопроса весь код, не связанный с ним.
  • 0
    glClear очистит сцену ... но почему вы хотите перезапустить сцену в первую очередь?
Показать ещё 1 комментарий
Теги:
opengl
glut

1 ответ

1
Лучший ответ

Мой подход может занять некоторое время на реструктуризацию вещей, но, безусловно, делает вещи очень простыми и удобными для решения в долгосрочной перспективе. У вас будет вся ваша логика внутри одного объекта под названием " Игра". Он отделен от кода OpenGL, который хранится внутри окна. Каждый раз, когда вам нужно перезапустить игру, вы просто уничтожаете игру и создаете новый игровой объект группы.

Изображение 174551

class Window {
    //...
};

class Game {
public:
    update(Window* window) {
        window->draw(_object);
    }

private:
    SomeObject _object;
};

// Application
int main() {
    Window* window = new Window();
    Game* game = new Game();

    bool isRestartKeyDown = false;

    while(true) {
        game->update(window);

        if(isRestartKeyDown) {
            delete game;
            game = new Game();
        }
    }
    delete game;
    delete window;
}
  • 0
    Спасибо, это хороший подход, но проблема в том, что я ничего не знаю о c ++: / и у меня мало времени для доставки игрового проекта. Я сделал функцию под названием respawn, которая сбрасывает все значения var и отображает сцену и нарисуйте прямоугольник, но когда его вызов только появляется сцена без моего движущегося прямоугольника
  • 0
    Если время ограничено, то взломайте! Позвольте мне лишь посоветовать вам устанавливать функции, такие как glutKeyboardFunc и glutTimerFunc только один раз в main. Сохраняйте все соответствующее поведение в отдельных функциях и соответственно используйте состояния переключателя.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню