C/C++游戏项目教程:《雷霆战机》
Posted MAX在码字
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++游戏项目教程:《雷霆战机》相关的知识,希望对你有一定的参考价值。
《雷霆战机》是以太空科幻世界观,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 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=JLh5Pqgchttps://jq.qq.com/?_wv=1027&k=JLh5Pqgc
以上是关于C/C++游戏项目教程:《雷霆战机》的主要内容,如果未能解决你的问题,请参考以下文章