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

📄 game.cpp

📁 一个小飞机游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//在此处定义WINDOW头文件
#include <windows.h>		// Windows 头文件
#include <stdio.h>

//在此处引用程序要求的附加头文件:
#include <gl\gl.h>			// OpenGL32库的头文件
#include <gl\glu.h>			// Glu32库的头文件

//在此处引用本程序的头文件
#include "5DG_Window.h"		// 框架文件
#include "Class.h"			// 类头文件
#include "Fmod.h"			// 音频库头文件
#include "Texture.h"		// 纹理导入头文件

//在此处加入程序要求的库到链接器中:
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")	
#pragma comment(lib, "fmodvc.lib")

//在此处定义WINDOWS全局变量:
GL_Window*	OGL_window;
Keys*		OGL_keys;

//在此处定义用户变量:
TextureTga	playertex[3];				// 纹理数组,保存纹理名字
TextureTga  computertex[3];
TextureTga	ammunitiontex[4];
TextureTga	awardtex[3];
TextureTga	othertex[4];

GLuint	base;						// 输出字体的显示列表号

bool start;							// 该值为真,表示游戏开始
bool startp;						// 辅助控制start,以免按住时不断轮换
bool end;							// 该值为真,表示游戏结束

bool keybombp;						// 控制炸弹发射用的布尔值,以保证按住不放时也只能发射一个炸弹
bool keyfirep;						// 控制子弹发射声音的布尔值,以保证不会产生叠音
int myPlaneNum;						// 玩家目前余下的飞机数目

DWORD lastTickCount=0;				// 运行到上一帧的时间点,用于求帧间隔时间
DWORD tickCount=0;					// 运行到当前帧的时间点,用于求帧间隔时间
int	 timer=0;						// 这一帧的运行时间
DWORD	endtime;					// 结束动画的起始时间

DWORD starttime;					// 用于控制片头动画的显示时间

FSOUND_SAMPLE *sound_1;				// 发射子弹的声音指针
FSOUND_SAMPLE *sound_2;				// 射击中的声音指针
FSOUND_SAMPLE *sound_3;				// 遇到物品的声音指针
FMUSIC_MODULE *sound_4;				// 游戏的背影音乐指针

float groudMove=0;					// 控制背影不断向下移动的变量
float startQuadOffset;				// 控制片头动画移动的变量

PlayerPlane myPlane;						// 玩家飞机
ComputerPlane computers[MAX_COMPUTER];		// 电脑飞机数组
Award	awards[MAX_AWARD];					// 物品数组
Ammunition ammunitions[MAX_AMMUNITION];		// 子弹数组

// 设置时钟
void setTimer()
{
	lastTickCount=tickCount;
	tickCount=GetTickCount();
	timer=tickCount-lastTickCount;	// 得到每帧的运行时间
}

// 游戏初始化
void GameInit(void)
{
	int i;
	for(i=0; i<MAX_AMMUNITION; i++){				// 清除全部子弹
		ammunitions[i].setLife(0);					// 将全部子弹无效
		ammunitions[i].setExplosible(false);		// 并且不让爆炸
	}
	for(i=0; i<MAX_AWARD; i++){						// 清除全部物品
		awards[i].setLife(0);						// 将全部物品无效
	}
	for (i=0; i<MAX_COMPUTER; i++)					// 对所有电脑飞机进行初始化设置
		computers[i].compinit();
	myPlane.initPlane(0,-230,100,2);				// 对玩家飞机初始化设置
	myPlaneNum=MAX_PLAYER;							// 设置玩家飞机个数
	starttime=0;									// 辅助控制游戏开始片头的播放时间
	startQuadOffset=0;								// 辅助控制游戏开始片头移动距离
}

// 声音初始化
GLvoid InitFMOD(GLvoid)
{
	if (FSOUND_Init(44100, 32, 0))					// 把声音初始化为44khz
	{
		sound_1=FSOUND_Sample_Load(5, "Data/fire.wav", FSOUND_LOOP_NORMAL, 0);
		sound_2=FSOUND_Sample_Load(FSOUND_FREE, "Data/hitTheTarget.wav", FSOUND_2D, 0);
		sound_3=FSOUND_Sample_Load(FSOUND_FREE, "Data/eat.wav", FSOUND_2D, 0);
		sound_4=FMUSIC_LoadSong("Data/bg.mid");
	}
}

// 声音释放
GLvoid FreeFMOD(GLvoid)
{
	if(sound_1) FSOUND_Sample_Free(sound_1);
	if(sound_2) FSOUND_Sample_Free(sound_2);
	if(sound_3) FSOUND_Sample_Free(sound_3);
	if(sound_4) FMUSIC_FreeSong(sound_4);
}

// 输出字体
void BuildFontGL(GLvoid)												// 建立位图字体(Bitmap Fonts)
{
	HFONT	newFont;													// 用以保存新的字体对象
	HFONT	oldFont;													// 用以保存原字体对象

	base = glGenLists(256);												// 存储256个字符

	newFont = CreateFont(	-18,										// 字体的高度
							0,											// 字体的宽度
							0,											// 旋转的角度
							0,											// 定位角度
							FW_THIN,									// 字体的粗细
							FALSE,										// 斜体?
							FALSE,										// 下划线?
							FALSE,										// 删除线?
							ANSI_CHARSET,								// 字符集
							OUT_TT_PRECIS,								// 输出精度
							CLIP_DEFAULT_PRECIS,						// 裁减精度
							ANTIALIASED_QUALITY,						// 输出质量
							FF_DONTCARE|DEFAULT_PITCH,					// 间距和字体族
							"Tahoma");									// 字体名称

	oldFont = (HFONT)SelectObject(OGL_window->hDC, newFont); 			// 选进设备描述表 
	wglUseFontBitmaps(OGL_window->hDC, 0, 256, base);					// 建立256个字符
	SelectObject(OGL_window->hDC, oldFont);								// 恢复设备描述表
	DeleteObject(newFont);												// 删除新字体
}

GLvoid KillFontGL(GLvoid)												// 删除保存字体的显示表
{
	glDeleteLists(base, 256);											// 删除256个字符
}

GLvoid glPrint(const char *fmt, ...)									// 建立Print函数
{
	char		text[256];												// 用以保存格式化后的字符串
	va_list		ap;														// 指向参数列表的指针

	if (fmt == NULL)													// 没有可输出的字符?
		return;															// 返回

	va_start(ap, fmt);													// 遍历字符串,查找变量
		vsprintf(text, fmt, ap);										// 将变量转换为显示的数字
	va_end(ap);															// 结果保存在text内

	glPushAttrib(GL_LIST_BIT);											// 显示表状态入栈
	glListBase(base);													// 显示表偏移量
	glCallLists((int)strlen(text), GL_UNSIGNED_BYTE, text);				// 绘制字符串
	glPopAttrib();														// 显示表状态出栈
}

// 载入所需纹理
void LoadTexture(void)
{
	BuildTexture("Data/Playercenter.tga", &playertex[0]);
	BuildTexture("Data/Playerleft.tga", &playertex[1]);
	BuildTexture("Data/Playerright.tga", &playertex[2]);

	BuildTexture("Data/Computer1.tga", &computertex[0]);
	BuildTexture("Data/Computer2.tga", &computertex[1]);
	BuildTexture("Data/Computer3.tga", &computertex[2]);

	BuildTexture("Data/Award1.tga", &awardtex[0]);
	BuildTexture("Data/Award2.tga", &awardtex[1]);
	BuildTexture("Data/Award3.tga", &awardtex[2]);

	BuildTexture("Data/Ball.tga", &ammunitiontex[0]);
	BuildTexture("Data/Heavyball.tga", &ammunitiontex[1]);
	BuildTexture("Data/Missile.tga", &ammunitiontex[3]);

	BuildTexture("Data/Groud1.tga", &othertex[0]);
	BuildTexture("Data/Groud2.tga", &othertex[1]);
	BuildTexture("Data/Planeexplode.tga", &othertex[2]);
	BuildTexture("Data/Ballexplode.tga", &othertex[3]);
}

// OpenGL初始化
BOOL Initialize(GL_Window* window, Keys* keys)	
{
	// 设置全局变量
	OGL_window	= window;
	OGL_keys	= keys;

	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);								// 清屏为黑色
	glClearDepth(1.0f);													// 设置深度缓存
	glDepthFunc(GL_LEQUAL);												// 选择深度测试方式
	glEnable(GL_DEPTH_TEST);											// 开启深度测试
	glShadeModel(GL_SMOOTH);											// 阴暗处理采用平滑方式
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);					// 最精细的透视计算
	
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

	LoadTexture();														// 调用载入纹理函数
	BuildFontGL();														// 调用初始化字体函数
	InitFMOD();															// 调用初始化声音函数

	return TRUE;														// 初始化成功返回TRUE
}

// 游戏背景绘制
void Background(void)
{
	glEnable(GL_TEXTURE_2D);
	// 左右两个始终存在的方框
	glPushMatrix();
	glTranslatef(250.0f, 0.0f, 10.0f);
	glBindTexture(GL_TEXTURE_2D,othertex[0].texID);
	glBegin(GL_QUADS);
		glTexCoord2i(0,  0);glVertex2i(  0, -300);
		glTexCoord2i(4,  0);glVertex2i(150, -300);
		glTexCoord2i(4, 10);glVertex2i(150,  300);
		glTexCoord2i(0, 10);glVertex2i(  0,  300);
	glEnd();
	glPopMatrix();

	glPushMatrix();
	glTranslatef(-250.0f, 0.0f, 10.0f);
	glBegin(GL_QUADS);
		glTexCoord2i(0, 0);glVertex2i(-150, -300);
		glTexCoord2i(4, 0);glVertex2i(   0, -300);
		glTexCoord2i(4,10);glVertex2i(   0,  300);
		glTexCoord2i(0,10);glVertex2i(-150,  300);
	glEnd();
	glPopMatrix();

	// 中央移动的星空背景
	glPushMatrix();
	glTranslatef(0.0f, 0.0f,-50.0f);
	glBindTexture(GL_TEXTURE_2D, othertex[1].texID);
	glBegin(GL_QUADS);
		glTexCoord2f(0.0f, 0.0f+groudMove);  glVertex2i(-250,-300);
		glTexCoord2f(2.0f, 0.0f+groudMove);  glVertex2i( 250,-300);
		glTexCoord2f(2.0f, 2.0f+groudMove);  glVertex2i( 250, 300);
		glTexCoord2f(0.0f, 2.0f+groudMove);  glVertex2i(-250, 300);
	glEnd();
	glPopMatrix();

	groudMove+=0.0001f*timer;
	glDisable(GL_TEXTURE_2D);
}

// 游戏未开始的场景绘制
void Opening(void)
{
	glRasterPos2f(-200.0f, 100.0f);
	glPrint("Press F5 to start a new game!");
	glRasterPos2f(-200.0f, 0.0f);
	glPrint(" Direction : W,S,A,D ");
	glRasterPos2f(-200.0f, -20.0f);
	glPrint(" Fire : J ; Missile: K");
	glRasterPos2f(-200.0f, -100.0f);
	int winscore=WIN_SCORE;
	glPrint("Mission : Earn %d Score! ", winscore);
}

// 开始游戏的主场景
void Running(void)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -