C/C++游戏项目教程:《雷霆战机》

C/C++游戏项目教程:《雷霆战机》_第1张图片

《雷霆战机》是以太空科幻世界观,12星座关卡模式和弹幕联袂上演掌上“星球大战”。百种战机,千种弹幕,酷炫装备,强劲暴走,演绎别样星海激情。在继承了经典飞行射击游戏爽快体验的同时,更添加了革命性的创新玩法,引爆了全世界玩家的打飞机热情!

C/C++游戏项目教程:《雷霆战机》_第2张图片

雷霆战机

我们今天就来模仿《雷霆战机》创造出属于我们自己的飞机大战

直接开始吧

首先定义飞机和子弹结构体

//1.定义数据
#define		WIDTH	591
#define		HEIGHT  864
IMAGE		backimg;  //定义背景数据
bool		isplay;	  //定义音乐数据

//定义自己的飞机
struct Plane {
	int		x, y;		//坐标
	int		w, h;		//图片的宽度 和 高度
	bool	isExist;    //是否存在
	IMAGE   img[2];     //图片
}myplane;

//子弹
IMAGE bimg[2];
struct Bullet {
	int		x, y;
	bool	isExist;    //是否存在
}bullet[15];			//10个

IMAGE eimg[2];
unsigned long t1, t2;
struct Enemy {
	int		x, y;
	bool	isExist;    //是否存在
	int     vy;         //速度
}enemy[15];			//10个

游戏进行初始化

//2.初始化
void GameInit() {
	//加载图片
	loadimage(&backimg, "images/background.jpg", WIDTH, HEIGHT);

	//播放背景音乐
	mciSendString("open images/backmusic.mp3",0,0,0);
	mciSendString("play images/backmusic.mp3", 0, 0, 0);
	isplay = true; //正在播放

	//初始化自己的飞机
	myplane.w = 94;
	myplane.h = 107;
	loadimage(&myplane.img[0], "images/plane0.jpg");
	loadimage(&myplane.img[1], "images/plane1.jpg");
	myplane.x = (WIDTH- myplane.w)/2;
	myplane.y = HEIGHT - myplane.h;
	myplane.isExist = true;

	//初始化自己的子弹 9 21
	loadimage(&bimg[0], "images/bullet0.jpg");
	loadimage(&bimg[1], "images/bullet1.jpg");
	for (int i = 0; i < 15; i++)
		bullet[i].isExist = false;

	loadimage(&eimg[0], "images/enemy0.jpg");
	loadimage(&eimg[1], "images/enemy1.jpg");
	for (int i = 0; i < 15; i++)
	{
		enemy[i].isExist = false;
		if (rand() % 2 == 0)
			enemy[i].vy = 1;
		else 
			enemy[i].vy = 2;
	}
		
	t1 = GetTickCount();
} 

绘制游戏背景

//3.绘制
void GameDraw() {
	BeginBatchDraw();

	//绘制背景图片
	putimage(0, 0, &backimg);
	//绘制自己的飞机
	if (myplane.isExist) {  //如果自己的飞机是存在的
		putimage(myplane.x, myplane.y, &myplane.img[0], SRCPAINT);
		putimage(myplane.x, myplane.y, &myplane.img[1], SRCAND);
	}

	//绘制自己的子弹
	for (int i = 0; i < 15; i++) {
		if (bullet[i].isExist) { //存在的子弹
			putimage(bullet[i].x, bullet[i].y, &bimg[0], SRCPAINT);
			putimage(bullet[i].x, bullet[i].y, &bimg[1], SRCAND);
		}
	}

	for (int i = 0; i < 15; i++) {
		if (enemy[i].isExist) { //存在的子弹
			putimage(enemy[i].x, enemy[i].y, &eimg[0], SRCPAINT);
			putimage(enemy[i].x, enemy[i].y, &eimg[1], SRCAND);
		}
	}

	EndBatchDraw();
}

游戏数据的更新

//4.数据的更新
void GameUpdate() {
	//非阻塞的 丝滑的
	if (GetAsyncKeyState(VK_UP)) myplane.y--;
	if (GetAsyncKeyState(VK_DOWN)) myplane.y++;
	if (GetAsyncKeyState(VK_LEFT)) myplane.x--;
	if (GetAsyncKeyState(VK_RIGHT)) myplane.x++;

	//按下某一个键的时候
	char key=' ';
	if (_kbhit()) {		 //检测按键
		key = _getch();  //接收按键 
		if (key == '1'){
			if(isplay)
				mciSendString("pause images/backmusic.mp3", 0, 0, 0);
			else
				mciSendString("play images/backmusic.mp3", 0, 0, 0);
			isplay = !isplay;
		}
		else if (key == 32)  //空格产生一个子弹
		{
			PlaySound("images/shoot.wav", NULL, SND_ASYNC | SND_FILENAME);
			for (int i = 0; i < 15; i++) {
				if (!bullet[i].isExist) //找到一个不存在的 100 50
				{
					bullet[i].x = myplane.x + (myplane.w - 9) / 2; //自己的飞机
					bullet[i].y = myplane.y - 21;
					bullet[i].isExist = true;
					break;
				}
			}
		}
	}

	//子弹自己移动
	for (int i = 0; i < 15; i++) {
		if (bullet[i].isExist)
		{
			bullet[i].y -= 2;
			if (bullet[i].y < 0) //飞出去
				bullet[i].isExist = false;
		}
	}

	for (int i = 0; i < 15; i++) {
		if (enemy[i].isExist)
		{
			enemy[i].y += enemy[i].vy;
			if (enemy[i].y > HEIGHT) //飞出去
				enemy[i].isExist = false;
		}
	}

	t2 = GetTickCount();
	if (t2 - t1 > 500)
	{
		//产生一个敌机
		for (int i = 0; i < 15; i++)
			if (!enemy[i].isExist) //找到一个不存在的 100 50
			{
				enemy[i].x = rand()%(HEIGHT-46); //自己的飞机
				enemy[i].y = -33;
				enemy[i].isExist = true;
				break;
			}

		t1 = t2;
	}

	//子弹碰撞敌机  子弹消失  敌机消失
	//数组   敌机
	for (int i = 0; i < 15; i++)  //遍历子弹
	{
		if (bullet[i].isExist) {  //找到存在的子弹
			for (int j = 0; j < 15; j++)  //遍历敌机
			{
				if (enemy[j].isExist) {
					if (bullet[i].x+9>=enemy[j].x&&
						bullet[i].x<= enemy[j].x+46&&
						bullet[i].y + 21 >= enemy[j].y&&
						bullet[i].y <= enemy[j].y+33)  //判断子弹和敌机有没有发生碰撞
					{
						bullet[i].isExist = false;
						enemy[j].isExist = false;
					}
				}
			}
		}
	}
}

最后用主函数进行调用

int main(){
	initgraph(WIDTH, HEIGHT);
	GameInit();  //初始化数据
	//游戏的过程
	while (1){
		GameDraw();  //不断绘制界面
		GameUpdate(); //数据也是不断更新
		Sleep(2);
	}
	return 0;
}

这样我们自己的《雷霆战机》就完成了。快去自己动手尝试一下叭!!!

有什么问题可以回帖留言,我尽量回答。想要C/C++学习资料以及其他项目的源码的可以加群【1083227756】了解。想要对程序员的未来发展有兴趣的也可加群闲聊。也可以关注微信公众号:【狐狸的编码时光】,希望和大家一起学习进步!!!

点击下方链接更快拿到学习资料以及项目源码


https://jq.qq.com/?_wv=1027&k=JLh5Pqgcicon-default.png?t=L9C2https://jq.qq.com/?_wv=1027&k=JLh5Pqgc

你可能感兴趣的:(C,C++,编程入门,c语言,c++,开发语言)