鱼C论坛

 找回密码
 立即注册
查看: 1554|回复: 2

c语言版本飞机大战 写了一小点 子弹发射为什么不是一串的,不应该啊,逻辑没问题啊

[复制链接]
发表于 2021-8-21 20:47:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 猪猪虾 于 2021-8-21 20:57 编辑

按一次空格,只发射一个子弹,不应该发射15个么,

visual studio调试GUI,不显示局部变量是怎么肥事
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <Windows.h>


void gameDraw();
void loadImg();
void gameInit();
void playerMove(int speed);
void createBullet();

//枚举
enum My
{
        //窗口的宽度和高度
        WIDTH = 480,
        HEIGHT = 700,
        BULLET_NUM = 15  //子弹的数量
};

//***********************玩家飞机定义********************************
struct Plane
{
        int x;
        int y;  //飞机的坐标
        bool live; //是否存活
        
}player, bull[BULLET_NUM]; //bull[]这里是定义了一个子弹的结构体数组

void gameInit()  //飞机位置的初始化
{
        loadImg();
        player.x = WIDTH / 2;
        player.y = HEIGHT - 120;
        player.live = true;

        //对子弹的处理,初始化15个子弹的初始位置
        for (int i = 0; i < BULLET_NUM; i++)
        {
                bull[i].x = 0;
                bull[i].y = 0;
                bull[i].live = false;
        }
}

//飞机移动
void playerMove(int speed)
{
        ////检测是否有键盘按下  这种方法卡顿会比较严重
        //if (_kbhit)
        //{
        //        //1._getch(),阻塞函数,同scanf,如果没有输入,就会卡住主程序,一直等待输入
        //        char key = _getch();
        //        switch (key)
        //        {
        //        case 'w':
        //        case 'W':
        //                player.y -= speed;
        //                break;
        //        case 's':
        //        case 'S':
        //                player.y += speed;
        //                break;
        //        case 'a':
        //        case 'A':
        //                player.x -= speed;
        //                break;
        //        case 'd':
        //        case 'D':
        //                player.x += speed;
        //                break;
        //        }
        //}
        //if (GetAsyncKeyState(VK_SPACE) )
        //{
        //        createBullet();
        //}
        

        //2.使用windows获取键盘的输入,按小键盘的上下左右
        //需要考虑飞机图片本身的长宽
        if (GetAsyncKeyState(VK_UP))
        {
                if (player.y > 0)
                {
                        player.y -= speed;
                }
        }
        if (GetAsyncKeyState(VK_DOWN))
        {
                if (player.y + 100 < HEIGHT)
                {
                        player.y += speed;
                }
        }
        if (GetAsyncKeyState(VK_LEFT))
        {
                if (player.x + 40 > 0)
                {
                        player.x -= speed;
                }
        }
        if (GetAsyncKeyState(VK_RIGHT))
        {
                if (player.x + 70 < WIDTH)
                {
                        player.x += speed;
                }
        }


        //按下按键就发射一组子弹//
        static DWORD t1 = 0, t2 = 0;
        if (GetAsyncKeyState(VK_SPACE) && t2- t1 > 500)
        {
                createBullet();
                t1 = t2;
        }
        t2 = GetTickCount();
}


//***********************子弹的处理*************************
void createBullet()
{
        //对子弹的处理,初始化15个子弹的初始位置
        for (int i = 0; i < BULLET_NUM; i++)
        {
                if (!bull[i].live)   //子弹的状态是false,就给他初始化成真,且子弹的位置初始化为飞机位置的头部中间
                {
                        bull[i].x = player.x+50;
                        bull[i].y = player.y;
                        bull[i].live = true;
                        break;
                }
                
        }
}

void BulletMove()
{
        for (int i = 0; i < BULLET_NUM; i++)
        {
                if (bull[i].live)   //子弹的状态是false,就给他初始化成真,且子弹的位置初始化为飞机位置的头部中间
                {
                        bull[i].y -= 1;  //子弹是向上移动的,只需要改变一个坐标
                        if (bull[i].y < 0)
                        {
                                bull[i].live = false;
                        }
                }

        }
}


//***********************背景绘制*************************

IMAGE bk;  //加载背景
IMAGE img_role[2];  //保存玩家的图片  ,一张正常的图,一张掩码图,用来去掉飞机的周围的背景
IMAGE bullet[2];  //加载子弹图片
void loadImg()
{
        //加载背景图片
        loadimage(&bk, L"C:/Users/LiYan/Desktop/c/c++/飞机大战素材包/images/background.jpg");

        //加载玩家图片
        loadimage(&img_role[0], L"C:/Users/LiYan/Desktop/c/c++/飞机大战素材包/images/me1.jpg");
        loadimage(&img_role[1], L"C:/Users/LiYan/Desktop/c/c++/飞机大战素材包/images/plane01.jpg");

        //加载子弹图片
        loadimage(&bullet[0], L"C:/Users/LiYan/Desktop/c/c++/飞机大战素材包/images/bullet1.jpg");
        loadimage(&bullet[1], L"C:/Users/LiYan/Desktop/c/c++/飞机大战素材包/images/bullet2.jpg");

}

void gameDraw()
{
        //把背景图片贴到界面上
        putimage(0, 0, &bk);

        //玩家图片
        putimage(player.x, player.y, &img_role[0]);
        //putimage(WIDTH/2, HEIGHT- 120 ,&img_role[1],SRCINVERT);

        //画子弹
        for (int i = 0; i < BULLET_NUM; i++)
        {
                if (bull[i].live)   //子弹的状态是false,就给他初始化成真,且子弹的位置初始化为飞机位置的头部中间
                {
                        putimage(bull[i].x, bull[i].y, &bullet[0]);
                        //putimage(bull[i].x, bull[i].y, &bullet[1]);
                }

        }
}



int main()
{
        //初始化图形界面 640*480
        initgraph(WIDTH, HEIGHT);
        gameInit();
        
        //双缓冲绘图  目的,图片在不断的移动需要不断的在背景图片上绘制图片,会出现频闪,解决频闪问题
        BeginBatchDraw();  

        while (1)
        {
                gameDraw();
                FlushBatchDraw();  //刷新
                playerMove(1);
                BulletMove();
        }
        EndBatchDraw();
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-22 21:15:52 | 显示全部楼层
哥们,我是初学者,有没有什么进阶的书或项目书介绍?我初学,基础学习到了指针了,后面不知道继续深入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-25 18:38:15 | 显示全部楼层
youtomefc 发表于 2021-8-22 21:15
哥们,我是初学者,有没有什么进阶的书或项目书介绍?我初学,基础学习到了指针了,后面不知道继续深入

跟着小甲鱼课程学呗,学完之后学数据结构,然后c++,我也还在学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 16:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表