资讯专栏INFORMATION COLUMN

C/C++游戏项目教程:看完只会说“编译飞机大战太简单了吧”

jsliang / 3309人阅读

摘要:飞机大战这是一款经典飞行射击类游戏,为玩家呈现一场不一样射击体验。简单的触屏操作,触屏按住随意一个地方,左右移动,便可自动攻击敌人,上下移动亦可躲避强敌。玩家在游戏中要做的就是驾驶着最新战机,向敌人发起冲击。

      《飞机大战》这是一款经典飞行射击类游戏,为玩家呈现一场不一样射击体验。简单的触屏操作,触屏按住随意一个地方,左右移动,便可自动攻击敌人,上下移动亦可躲避强敌。玩家在游戏中要做的就是驾驶着最新战机,向敌人发起冲击。

今天我就用C++带大家一步步去完成风靡全球的小程序飞机大战小游戏~

PS:要安装easyx图形库哦 #include    

开发工具为VS2013

在此之前呢,和大家说明一下,因为这是一个比较大的项目了,所以展示所有代码会有些困难,所以我裁剪了主要的大部分代码,主要目的是让大家明白实现这个项目的逻辑思路,希望大家可以理解,完整代码/编译器/图形库在文章最下方获取哦

正片开始:

第一步: 打开vs2013,创建一个项目,并将准备好的素材资源放到同级目录下(素材可以在文章最下方领取),如图:

 

 第二步:写出基本框架,看自己背景图片的像素,创建一个相同像素的图形窗口,并把背景图片加上:

 

第三步:设置音乐,及玩家、敌机、子弹,开启双缓冲绘图: 

#include#include//包含图形库头文件 easyx#include#pragma comment(lib,"winmm.lib")//加载多媒体设备库#define WIN_WIDTH 591#define WIN_HEIGHT 864#define PLAYER_BULLET 15 //玩家子弹数量#define ENEMYPLANE_NUM 10//定义变量 int  a=666;//定义一个图片IMAGE bk;IMAGE img_player[4];IMAGE img_bullet[2];IMAGE img_enemy[2];struct Plane{	int x;	int y;	bool flag;//..是否死亡	int width;	int height;}player, pbull[PLAYER_BULLET], enemy[ENEMYPLANE_NUM];//时间的变化量DWORD t1, t2;//分模块处理,专门的事情,准们的函数做void GameInit(){	//1,创建一个图形窗口	initgraph(WIN_WIDTH, WIN_HEIGHT);	//设置随机数种子	srand(GetTickCount());	//2,贴背景图片	//2.1加载图片到bk里面	loadimage(&bk, "./images/background.jpg");	loadimage(&img_player[0], "./images/planeNormal_1.jpg");	loadimage(&img_player[1], "./images/planeNormal_2.jpg");	loadimage(&img_player[2], "./images/planeBoom_1.jpg");	loadimage(&img_player[3], "./images/planeBoom_2.jpg");	loadimage(&img_bullet[0], "./images/bullet1.jpg");	loadimage(&img_bullet[1], "./images/bullet2.jpg");	loadimage(&img_enemy[0], "./images/enemy_1.jpg");	loadimage(&img_enemy[1], "./images/enemy_2.jpg");	//3,播放音乐 首先打开音乐,然后播放音乐	mciSendString("open ./images/game_music.mp3 alias BGM", 0, 0, 0);	mciSendString("play BGM repeat", 0, 0, 0);	//初始化玩家数据	player.height = 120;	player.width = 117;	player.x = WIN_WIDTH / 2 - player.width / 2;	player.y = WIN_HEIGHT - player.height;	player.flag = true;	//初始化子弹	for (int i = 0; i < PLAYER_BULLET; i++)	{		pbull[i].flag = false;		pbull[i].height = 24;		pbull[i].width	= 19;	}	//初始化时间变量	t1 = t2 = GetTickCount();	//初始化敌机	for (int i = 0; i < ENEMYPLANE_NUM; i++)	{		enemy[i].flag = false;		enemy[i].width = 52;		enemy[i].height = 39;	}}//游戏绘制函数void GameDarw(){	//双缓冲绘图,防止画面闪烁	BeginBatchDraw();	//2.2输出背景图片	putimage(0, 0, &bk);	//透明贴图	if (player.flag)	{		putimage(player.x, player.y, &img_player[0], NOTSRCERASE);		putimage(player.x, player.y, &img_player[1], SRCINVERT);	}	//绘制玩家子弹	for (int i = 0; i < PLAYER_BULLET; i++)	{		if (pbull[i].flag)		{			putimage(pbull[i].x, pbull[i].y, &img_bullet[0], NOTSRCERASE);			putimage(pbull[i].x, pbull[i].y, &img_bullet[1], SRCINVERT);		}	}	//绘制敌机	for (int i = 0; i < ENEMYPLANE_NUM; i++)	{		if (enemy[i].flag)		{			putimage(enemy[i].x, enemy[i].y, &img_enemy[0], NOTSRCERASE);			putimage(enemy[i].x, enemy[i].y, &img_enemy[1], SRCINVERT);		}	}	EndBatchDraw();}//产生玩家子弹void CreatBullet(){	for (int i = 0; i < PLAYER_BULLET; i++)	{		if (!pbull[i].flag)		{			pbull[i].x	= player.x+53;			pbull[i].y  = player.y;			pbull[i].flag = true;			break;		}	}}//生成敌机void CreateEnemy(){	for (int i = 0; i < ENEMYPLANE_NUM; i++)	{		if (!enemy[i].flag)		{			enemy[i].x = rand() % (WIN_WIDTH - enemy[i].width);			enemy[i].y =0;			enemy[i].flag = true;			break;		}	}}void EnemyMove(int speed){	for (int i = 0; i < ENEMYPLANE_NUM; i++)	{		if (enemy[i].flag)		{			enemy[i].y += speed;			if (enemy[i].y>WIN_HEIGHT)			{				enemy[i].flag = false;			}		}	}}//操控飞机,开..void KeyControl(int speed){	//按键处理,用getch()	//向上移动  边界处理	if(GetAsyncKeyState(VK_UP) && player.y>=0)	{		player.y -= speed;	}	//向下移动	if (GetAsyncKeyState(VK_DOWN) && player.y+player.height<=WIN_HEIGHT)	{		player.y += speed;	}	//向左移动	if (GetAsyncKeyState(VK_LEFT) && player.x+player.width/2>=0)	{		player.x -= speed;	}	//向右移动	if (GetAsyncKeyState(VK_RIGHT) && player.x+player.width/2<=WIN_WIDTH)	{		player.x += speed;	}	//发射子弹	if (GetAsyncKeyState(VK_SPACE) && t2-t1>200)	{		mciSendString("close gun", 0, 0, 0);		mciSendString("open ./images/f_gun.mp3 alias gun", 0, 0, 0);		mciSendString("play gun", 0, 0, 0);				//产生一个子弹		CreatBullet();		t1 = t2;	}	t2 = GetTickCount();}//生成敌机void CreateEnemy(){	for (int i = 0; i < ENEMYPLANE_NUM; i++)	{		if (!enemy[i].flag)		{			enemy[i].x = rand() % (WIN_WIDTH - enemy[i].width);			enemy[i].y =0;			enemy[i].flag = true;			break;		}	}}void EnemyMove(int speed){	for (int i = 0; i < ENEMYPLANE_NUM; i++)	{		if (enemy[i].flag)		{			enemy[i].y += speed;			if (enemy[i].y>WIN_HEIGHT)			{				enemy[i].flag = false;			}		}	}}

 

第四步:设置子弹的移动,鼠标操控飞机:

//玩家子弹的移动void BulletMove(int speed){	for (int i = 0; i < PLAYER_BULLET; i++)	{		if (pbull[i].flag)		{			pbull[i].y -= speed ;			if (pbull[i].y < 0)			{				pbull[i].flag = false;			}		}	}}//操控飞机,开..void KeyControl(int speed){	//按键处理,用getch()	//向上移动  边界处理	if(GetAsyncKeyState(VK_UP) && player.y>=0)	{		player.y -= speed;	}	//向下移动	if (GetAsyncKeyState(VK_DOWN) && player.y+player.height<=WIN_HEIGHT)	{		player.y += speed;	}	//向左移动	if (GetAsyncKeyState(VK_LEFT) && player.x+player.width/2>=0)	{		player.x -= speed;	}	//向右移动	if (GetAsyncKeyState(VK_RIGHT) && player.x+player.width/2<=WIN_WIDTH)	{		player.x += speed;	}	//发射子弹	if (GetAsyncKeyState(VK_SPACE) && t2-t1>200)	{		mciSendString("close gun", 0, 0, 0);		mciSendString("open ./images/f_gun.mp3 alias gun", 0, 0, 0);		mciSendString("play gun", 0, 0, 0);				//产生一个子弹		CreatBullet();		t1 = t2;	}	t2 = GetTickCount();}

第五步:设置游戏开始,判断子弹是否击中:

//开始...void PlayPlane(){	//每个敌军和每个子弹都要比较	for (int i = 0; i < ENEMYPLANE_NUM; i++)	{		if (!enemy[i].flag)			continue;		//遍历子弹数组		for (int k = 0; k < PLAYER_BULLET; k++)		{			if (!pbull[k].flag)				continue;			//判断子弹是否击中敌机			if (pbull[k].x>enemy[i].x && pbull[k].xenemy[i].y && pbull[k].y

 


好啦,重要的基础代码就这些~需要完整源码对照的同学可以点击文章末链接群领取,飞机大战/雷霆战机教程就到此结束啦,后续我会发布更多的项目源码以及学习资料,希望大家可以持续关注,想要C/C++学习资料以及完整源码素材图形库开发工具等的可以加群【639681529】了解,或者有问题也可以进群提问,希望大家可以在这里得到自己想要的知识,也希望如果对你有所帮助的话可以多多关注点赞评论,有建议也可以在评论区提出,谢谢大家的支持!
 

 

 点击下方链接进群:

源码素材编译器图形库还有各种学习资料都在这里等你哦~https://jq.qq.com/?_wv=1027&k=ne3yBn5V

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/124024.html

相关文章

  • C/C++游戏项目详细教程:《黄金矿工》

    摘要:黄金矿工是一款非常经典的游戏。在游戏中,玩家通过不断挖矿,获取金子,最终能够闯入下一关。游戏的玩法主要是通过不断采集地下的黄金和钻石,来得到更高的积分。      《黄金矿工》是一款非常经典的游戏。在游戏中,玩家通过不断挖矿,获取金子,最终能够闯入下一关。在这个过程中,会不断有岩石、烟雾、老...

    cnio 评论0 收藏0
  • C/C++游戏项目:中国程序员一定要会的中国象棋教程

    摘要:中国象棋是中国一种流传十分广泛的游戏。宣布认输的一方算输。今天我就用语言带大家一步步去完成好玩有趣学会就能和朋友对弈的中国象棋小游戏。        中国象棋是中国一种流传十分广泛的游戏。 下棋双方根据自己对棋局形式的理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘这块特定的战场...

    kamushin233 评论0 收藏0
  • 彻底理解z-index,看完还是只会无厘头的设置9999你打我~~~~

    摘要:如果同级父元素不是层叠上下文元素就不需要看父元素的眼色了文章到这里就结束了,希望看完这篇文章的同学可以彻底理解。 今天写代码用antd-mobile的checkbox时候,想在内容文本后面添加一个icon,并且需要对这个icon绑定事件,发现绑定之后怎么也点不中,调试发现原来被层层嵌套的dom元素盖住了,肯定是z-index在作祟。可是按照我之前对z-index的了解(自信满满)却怎么...

    bladefury 评论0 收藏0
  • 彻底理解z-index,看完还是只会无厘头的设置9999你打我~~~~

    摘要:如果同级父元素不是层叠上下文元素就不需要看父元素的眼色了文章到这里就结束了,希望看完这篇文章的同学可以彻底理解。 今天写代码用antd-mobile的checkbox时候,想在内容文本后面添加一个icon,并且需要对这个icon绑定事件,发现绑定之后怎么也点不中,调试发现原来被层层嵌套的dom元素盖住了,肯定是z-index在作祟。可是按照我之前对z-index的了解(自信满满)却怎么...

    RobinTang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<