《雷霆战机》是以太空科幻世界观,12星座关卡模式和弹幕联袂上演掌上“星球大战”。百种战机,千种弹幕,酷炫装备,强劲暴走,演绎别样星海激情。在继承了经典飞行射击游戏爽快体验的同时,更添加了革命性的创新玩法,引爆了全世界玩家的打飞机热情!
雷霆战机
我们今天就来模仿《雷霆战机》创造出属于我们自己的飞机大战
直接开始吧
首先定义飞机和子弹结构体
//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 21loadimage(&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);elsemciSendString("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=JLh5Pqgchttps://jq.qq.com/?_wv=1027&k=JLh5Pqgchttps://jq.qq.com/?_wv=1027&k=JLh5Pqgc
点击下方链接观看视频详细讲解
https://www.bilibili.com/video/BV19m4y1S7m3/https://www.bilibili.com/video/BV19m4y1S7m3/