⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.cpp

📁 一个小飞机游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	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 + -