我遇到的问题是我开发的一款游戏。
目标是制作一个游戏,你可以杀死广场,最后显示最大分数和最大速度,但我也想让游戏重新启动,当玩家按下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 :(得分:1)
我的方法可能需要一些时间来重组事情,但从长远来看,它肯定会使事情变得非常简单和方便。您可以将所有逻辑包含在一个名为 Game 的对象中。它与存储在 Window 中的OpenGL代码分开。每当你需要重新启动游戏时,你只需要销毁游戏并创建一个乐队新的游戏对象。
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;
}