|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
复制代码 |
|