1.涉及到的知识点:结构体、循环、控制语句。
2.使用的工具:VS2019
一、窗口界面的建立
(1)建立头文件与主函数
(2)创建一个图形窗口
1.贴背景图片,将背景图片加载到项目中。(注:bk是我的图片名称)
2.输出背景图片以及飞机图片
(3)播放音乐
mciSendString播放音乐的关键字
(4)创建一个游戏初始化,将窗口与图片、音乐进行封装。
使用结构体对飞机进行处理。这里我们坐标的方式对飞机进行位置的移动
二、初始化玩家数据
1.定义窗口的比例
2.操控飞机
(1)按键处理,用GetAsynKeyState()进行获取数据
(2)绘制函数,用到双缓冲进行绘图,防止画面闪烁 BeginBatchDraw();EndBatchDraw()
3、初始化子弹
4、发射子弹
5、攻击敌机
三、整体运行结果
整体代码如下:
#include<stdio.h>
#include<graphics.h>//包含图形库头文件 easyx
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")//加载多媒体设备库
#define WIN_WIDTH 480
#define WIN_HEIGHT 650
#define PLAYER_BULLET 15//玩家子弹数量
#define ENEMYPLANE_NUM 10
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[10];
//时间的变化量
DWORD t1, t2;
//分模块处理,专门的事情,专门的函数
void GameInit()
{
//创建一个图形窗口
initgraph(WIN_WIDTH, WIN_HEIGHT);
//设置随机数
srand(GetTickCount());
//贴背景图片
loadimage(&bk, "detu.jpg");
//加载小飞机到bk里面
loadimage(&img_player[0],"fei2.jpg");
loadimage(&img_player[1], "fei1.jpg");
loadimage(&img_player[2], "fei3.jpg");
loadimage(&img_player[3], "fei4.jpg");
loadimage(&img_bullet[0], "bullet1.jpg");
loadimage(&img_bullet[1], "bullet2.jpg");
loadimage(&img_enemy[0], "enemy_1.jpg");
loadimage(&img_enemy[1], "enemy_2.jpg");
//播放音乐
mciSendString("open 1.mp3 alias BGM", 0, 0, 0);
mciSendString("play BGM", 0, 0, 0);//初始化玩家数据
player.height=120;
player.width = 120;
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 = 24;
}
//初始化时间变量
t1 = t2 = GetTickCount();
//初始化敌机
for (int i = 0; i < ENEMYPLANE_NUM; i++)
{
enemy[i].flag = false;
enemy[i].width = 52;
enemy[i].height = 39;
}
}
//游戏绘制函数
void GameDraw()
{
//双缓冲绘图。防止画面闪烁
BeginBatchDraw();
//输出背景图片
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 + 60;
pbull[i].y = player.y;
pbull[i].flag = true;
break;
}
}
}
//操控飞机,开飞机
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)
{
//按键处理,控制飞机的移动
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 > 100)
{
CreatBullet();t1 = t2;
}
t2 = GetTickCount();
}
//生成敌机
void CreateEnemy()
{
for (int i = 0; i< ENEMYPLANE_NUM;i++)
{
if (!enemy[i].flag)
{
enemy[i].y = 0;
enemy[i].x = rand() % (WIN_WIDTH - enemy[i].width);//随机产生敌机
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 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].x<enemy[i].x + enemy[i].width &&
pbull[k].y>enemy[i].y && pbull[k].y < enemy[i].y + enemy[i].height)
{
//击中了,敌机要消失,子弹也要消失
enemy[i].flag = false;
pbull[i].flag = false;
}
}
}}
int main()
{
GameInit();//调用函数
while (1)
{
GameDraw();
KeyControl(1);
Bulletmove(1);
if (rand() % 50 == 1)
{
CreateEnemy();
}
PlayPlane();
EnemyMove(1);
}
getchar();
return 0;
}