📄 game.cpp
字号:
{
int i;
// 片头播放(播放时间4000ms)
if(starttime<4000){
starttime += timer;
startp=true; // 禁用F5
if(starttime<2000)
startQuadOffset += 0.16f*timer;
else
startQuadOffset -= 0.16f*timer;
// 下面的移动方块
glPushMatrix();
glTranslatef(0.0f,-300.0f,-20.0f);
glTranslatef(0.0f, startQuadOffset, 0.0f);
glBindTexture(GL_TEXTURE_2D, othertex[0].texID);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2i(0, 0);glVertex2i(-250,-320);
glTexCoord2i(2, 0);glVertex2i( 250,-320);
glTexCoord2i(2, 2);glVertex2i( 250, 0);
glTexCoord2i(0, 2);glVertex2i(-250, 0);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
// 上面的移动方块
glPushMatrix();
glTranslatef(0.0f, 300.0f,-20.0f);
glTranslatef(0.0f,-startQuadOffset, 0.0f);
glBindTexture(GL_TEXTURE_2D, othertex[0].texID);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2i(0, 0);glVertex2i(-250, 0);
glTexCoord2i(2, 0);glVertex2i( 250, 0);
glTexCoord2i(2, 2);glVertex2i( 250, 320);
glTexCoord2i(0, 2);glVertex2i(-250, 320);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
return;
}
startp=false;
glEnable(GL_BLEND); // 开启透明,将边角透明掉
// 电脑的飞机处理
for(i=0; i<MAX_COMPUTER; i++){
computers[i].move();
computers[i].fire();
computers[i].draw();
computers[i].blast();
computers[i].update();
}
// 子弹处理
for(i=0; i<MAX_AMMUNITION; i++){
ammunitions[i].move ();
ammunitions[i].draw ();
ammunitions[i].blast();
}
// 物品处理
for(i=0; i<MAX_AWARD; i++){
awards[i].move();
awards[i].draw();
awards[i].eat();
}
// 玩家飞机处理
// 飞机移动
if(OGL_keys->keyDown['W']==TRUE)
myPlane.moveUp();
else if(OGL_keys->keyDown['S']==TRUE)
myPlane.moveDown ();
if(OGL_keys->keyDown['A']==TRUE)
myPlane.moveLeft ();
else if(OGL_keys->keyDown['D']==TRUE)
myPlane.moveRight ();
else
myPlane.stay();
// 飞机发射子弹
if(OGL_keys->keyDown['J']==TRUE){
myPlane.fire();
if(!keyfirep){
FSOUND_PlaySound(5,sound_1);
keyfirep=true;
}
}
if(OGL_keys->keyDown['J']==FALSE || myPlaneNum<=0){
keyfirep=false;
FSOUND_StopSound(5);
}
// 飞机发射炸弹
if(OGL_keys->keyDown['K']==TRUE && !keybombp){
myPlane.fireBomb();
keybombp=true;
}
if(OGL_keys->keyDown['K']==FALSE)
keybombp=false;
myPlane.draw(); // 飞机绘制
myPlane.hitcomPlane(); // 飞机与敌机的碰撞检测
myPlane.blast(); // 飞机的爆炸处理
myPlane.update(); // 飞机的更新处理
glDisable(GL_BLEND); // 绘制完毕,关闭透明
// 显示玩家分数
glPushMatrix();
glRasterPos3f(140.0f,-285.0f,10.0);
glPrint("score:%.2f", (float)myPlane.getScore());
glPopMatrix();
// 显示玩家的飞机数
glPushMatrix();
glColor3f(1.0f, 1.0f, 1.0f);
glTranslatef(240.0f,-265.0f, 0.0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, playertex[0].texID);
for(i=1; i<=myPlaneNum; i++){
glTranslatef(-20.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex2i(-10,-10);
glTexCoord2i(1, 0); glVertex2i( 10,-10);
glTexCoord2i(1, 1); glVertex2i( 10, 10);
glTexCoord2i(0, 1); glVertex2i(-10, 10);
glEnd();
}
glDisable(GL_TEXTURE_2D);
glColor3f(1.0f, 1.0f, 1.0f);
glPopMatrix();
// 显示玩家持有的炸弹个数
glPushMatrix();
glTranslatef(-230.0f,-265.0f,0.0);
glColor3f(1.0f, 1.0f, 1.0f);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, ammunitiontex[3].texID);
for(i=1; i<=myPlane.getBombNum(); i++){
glTranslatef(20.0f, 0.0f, 0.0);
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex2i(-10,-10);
glTexCoord2i(1, 0); glVertex2i( 10,-10);
glTexCoord2i(1, 1); glVertex2i( 10, 10);
glTexCoord2i(0, 1); glVertex2i(-10, 10);
glEnd();
}
glDisable(GL_TEXTURE_2D);
glColor3f(1.0f, 1.0f, 1.0f);
glPopMatrix();
// 显示玩家飞机的生命长度
// 表示生命的矩形前的飞机图标
glPushMatrix();
glTranslatef(-240.0f,-290.0f, 0.0f);
glColor3f(1.0f, 1.0f, 1.0f);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, playertex[0].texID);
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex2i(-10,-10);
glTexCoord2i(1, 0); glVertex2i( 10,-10);
glTexCoord2i(1, 1); glVertex2i( 10, 10);
glTexCoord2i(0, 1); glVertex2i(-10, 10);
glEnd();
glDisable(GL_TEXTURE_2D);
glColor3f(1.0f, 1.0f, 1.0f);
glPopMatrix();
// 矩形长度表示生命的长短
glPushMatrix();
glTranslatef(-230.0f,-290.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_QUADS);
glVertex2f(0.0f,-5.0f);
glVertex2f(myPlane.getLife(),-5.0f);
glVertex2f(myPlane.getLife(), 5.0f);
glVertex2f(0.0f, 5.0f);
glEnd();
glColor3f(1.0f, 1.0f, 1.0f);
glPopMatrix();
}
// 游戏结束函数
void Ending(void)
{
FSOUND_StopSound(5); // 停止播放枪声
FMUSIC_StopSong(sound_4);
keyfirep=false;
if(myPlane.getScore()<WIN_SCORE){ // 分数不够,游戏失败
if(GetTickCount()-endtime<2000){ // 游戏结束后2s内显示
startp=true; // 禁用F5
glRasterPos3f(-200.0f, 100.0f,-20.0f);
glPrint("Final Score: %d!", myPlane.getScore());
glRasterPos3f(-200.0f,-100.0f,-20.0f);
glPrint("You Lost!! Try Again!!");
}else{
start=false;
startp=false;
end=false;
}
}else{ // 分数达到,游戏胜利
if(GetTickCount()-endtime<2000){ // 游戏结束后2s内显示
startp=true; // 禁用F5
glRasterPos3f(-200.0f, 100.0f,-20.0f);
glPrint("Congratulations!!");
glRasterPos3f(-200.0f,-100.0f,-20.0f);
glPrint("YOU WIN!!");
}else{
start=false;
startp=false;
end=false;
}
}
}
// 绘制的主场景
void DrawSceneGL(void)
{
setTimer(); // 取得每帧的运行时间
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
Background(); // 绘制背景
if(!start){ // 游戏尚未开始
Opening(); // 调用游戏还未开始显示的内容函数
}else{
if(!end){ // 游戏开始且末结束
Running(); // 调用游戏运行的主函数
}else{ // 游戏运行结束
Ending(); // 调用游戏结束的处理函数
}
}
glFlush();
}
// 更新对消息的动作
void Update(void)
{
if (OGL_keys->keyDown[VK_ESCAPE] == TRUE) // 判断ESC键是否按下
{
TerminateApplication (OGL_window); // 结束程序
}
if (OGL_keys->keyDown[VK_F1] == TRUE) // 判断F1是否按下
{
PostMessage (OGL_window->hWnd, WM_TOGGLEFULLSCREEN, 0, 0); // 在全屏/窗口模式间切换
}
// 对F5按键的处理,用于控制游戏开始
if(OGL_keys->keyDown[VK_F5] == TRUE&&!startp){
start=!start;
startp=true;
if(start){
FMUSIC_PlaySong(sound_4);
GameInit(); // 调用游戏初始化设置函数
}else{
FMUSIC_StopSong(sound_4);
}
}
if(OGL_keys->keyDown[VK_F5] == FALSE)
startp=false;
}
// 退出前扫尾工作
void Deinitialize(void)
{
KillFontGL();
FreeFMOD();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -