鱼C论坛

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

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

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

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

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

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

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

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


  6. void gameDraw();
  7. void loadImg();
  8. void gameInit();
  9. void playerMove(int speed);
  10. void createBullet();

  11. //枚举
  12. enum My
  13. {
  14.         //窗口的宽度和高度
  15.         WIDTH = 480,
  16.         HEIGHT = 700,
  17.         BULLET_NUM = 15  //子弹的数量
  18. };

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

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

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

  41. //飞机移动
  42. void playerMove(int speed)
  43. {
  44.         ////检测是否有键盘按下  这种方法卡顿会比较严重
  45.         //if (_kbhit)
  46.         //{
  47.         //        //1._getch(),阻塞函数,同scanf,如果没有输入,就会卡住主程序,一直等待输入
  48.         //        char key = _getch();
  49.         //        switch (key)
  50.         //        {
  51.         //        case 'w':
  52.         //        case 'W':
  53.         //                player.y -= speed;
  54.         //                break;
  55.         //        case 's':
  56.         //        case 'S':
  57.         //                player.y += speed;
  58.         //                break;
  59.         //        case 'a':
  60.         //        case 'A':
  61.         //                player.x -= speed;
  62.         //                break;
  63.         //        case 'd':
  64.         //        case 'D':
  65.         //                player.x += speed;
  66.         //                break;
  67.         //        }
  68.         //}
  69.         //if (GetAsyncKeyState(VK_SPACE) )
  70.         //{
  71.         //        createBullet();
  72.         //}
  73.        

  74.         //2.使用windows获取键盘的输入,按小键盘的上下左右
  75.         //需要考虑飞机图片本身的长宽
  76.         if (GetAsyncKeyState(VK_UP))
  77.         {
  78.                 if (player.y > 0)
  79.                 {
  80.                         player.y -= speed;
  81.                 }
  82.         }
  83.         if (GetAsyncKeyState(VK_DOWN))
  84.         {
  85.                 if (player.y + 100 < HEIGHT)
  86.                 {
  87.                         player.y += speed;
  88.                 }
  89.         }
  90.         if (GetAsyncKeyState(VK_LEFT))
  91.         {
  92.                 if (player.x + 40 > 0)
  93.                 {
  94.                         player.x -= speed;
  95.                 }
  96.         }
  97.         if (GetAsyncKeyState(VK_RIGHT))
  98.         {
  99.                 if (player.x + 70 < WIDTH)
  100.                 {
  101.                         player.x += speed;
  102.                 }
  103.         }


  104.         //按下按键就发射一组子弹//
  105.         static DWORD t1 = 0, t2 = 0;
  106.         if (GetAsyncKeyState(VK_SPACE) && t2- t1 > 500)
  107.         {
  108.                 createBullet();
  109.                 t1 = t2;
  110.         }
  111.         t2 = GetTickCount();
  112. }


  113. //***********************子弹的处理*************************
  114. void createBullet()
  115. {
  116.         //对子弹的处理,初始化15个子弹的初始位置
  117.         for (int i = 0; i < BULLET_NUM; i++)
  118.         {
  119.                 if (!bull[i].live)   //子弹的状态是false,就给他初始化成真,且子弹的位置初始化为飞机位置的头部中间
  120.                 {
  121.                         bull[i].x = player.x+50;
  122.                         bull[i].y = player.y;
  123.                         bull[i].live = true;
  124.                         break;
  125.                 }
  126.                
  127.         }
  128. }

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

  141.         }
  142. }


  143. //***********************背景绘制*************************

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

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

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

  157. }

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

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

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

  173.         }
  174. }



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

  183.         while (1)
  184.         {
  185.                 gameDraw();
  186.                 FlushBatchDraw();  //刷新
  187.                 playerMove(1);
  188.                 BulletMove();
  189.         }
  190.         EndBatchDraw();
  191.         return 0;
  192. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

跟着小甲鱼课程学呗,学完之后学数据结构,然后c++,我也还在学
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-26 20:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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