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