制作一个攻击敌机小游戏

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值