OpenGL重启场景

Posted

技术标签:

【中文标题】OpenGL重启场景【英文标题】:OpenGL restart scene 【发布时间】:2014-11-21 17:07:58 【问题描述】:

我在为班级开发的游戏遇到问题。

目标是做一个游戏,你可以杀死方块,最后显示最高分数和最高速度,但我也想让游戏在玩家按下 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

【问题讨论】:

main 应该返回 int。另外,我建议您从问题中删除所有与它无关的代码。 glClear 将清除场景...但是为什么要首先重新启动场景? 我编辑了,现在我只显示引用问题的代码。我想重启场景重启游戏,再玩一遍。 【参考方案1】:

我的方法可能需要一些时间来重组事物,但从长远来看,它肯定会让事情变得非常简单和方便。您会将所有逻辑都包含在一个名为 Game 的对象中。它与存储在 Window 内的 OpenGL 代码分开。每次您需要重新启动游戏时,您只需销毁 Game 并创建一个新的 Game 对象。

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;

【讨论】:

谢谢,这是一个很好的方法,但问题是我对 c++ 一无所知:/而且我没有时间交付游戏项目。我创建了一个名为 respawn 的函数来重置所有 var 值并渲染场景并绘制矩形,但是当它被调用时只出现没有我移动矩形的场景 如果时间紧迫,那就赶紧走吧!我只是建议您在 main 中只设置一次诸如 glutKeyboardFuncglutTimerFunc 之类的函数。将所有相关行为保留在单个函数中,并相应地使用开关状态。

以上是关于OpenGL重启场景的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenGL 的 C++ 中的原始重启索引错误

想问问,用opengl鼠标消息响应来确定在场景中前进或后退,其效果有点卡的感觉,怎么改进啊?

OpenGL中的交叉淡入淡出场景

OpenGL片段着色器不照亮场景

OpenGL坐标转换场景到世界

OpenGL在场景中移动表格