c语言版本飞机大战 写了一小点 子弹发射为什么不是一串的,不应该啊,逻辑没问题啊
本帖最后由 猪猪虾 于 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; //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.x = 0;
bull.y = 0;
bull.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.live) //子弹的状态是false,就给他初始化成真,且子弹的位置初始化为飞机位置的头部中间
{
bull.x = player.x+50;
bull.y = player.y;
bull.live = true;
break;
}
}
}
void BulletMove()
{
for (int i = 0; i < BULLET_NUM; i++)
{
if (bull.live) //子弹的状态是false,就给他初始化成真,且子弹的位置初始化为飞机位置的头部中间
{
bull.y -= 1;//子弹是向上移动的,只需要改变一个坐标
if (bull.y < 0)
{
bull.live = false;
}
}
}
}
//***********************背景绘制*************************
IMAGE bk;//加载背景
IMAGE img_role;//保存玩家的图片,一张正常的图,一张掩码图,用来去掉飞机的周围的背景
IMAGE bullet;//加载子弹图片
void loadImg()
{
//加载背景图片
loadimage(&bk, L"C:/Users/LiYan/Desktop/c/c++/飞机大战素材包/images/background.jpg");
//加载玩家图片
loadimage(&img_role, L"C:/Users/LiYan/Desktop/c/c++/飞机大战素材包/images/me1.jpg");
loadimage(&img_role, L"C:/Users/LiYan/Desktop/c/c++/飞机大战素材包/images/plane01.jpg");
//加载子弹图片
loadimage(&bullet, L"C:/Users/LiYan/Desktop/c/c++/飞机大战素材包/images/bullet1.jpg");
loadimage(&bullet, L"C:/Users/LiYan/Desktop/c/c++/飞机大战素材包/images/bullet2.jpg");
}
void gameDraw()
{
//把背景图片贴到界面上
putimage(0, 0, &bk);
//玩家图片
putimage(player.x, player.y, &img_role);
//putimage(WIDTH/2, HEIGHT- 120 ,&img_role,SRCINVERT);
//画子弹
for (int i = 0; i < BULLET_NUM; i++)
{
if (bull.live) //子弹的状态是false,就给他初始化成真,且子弹的位置初始化为飞机位置的头部中间
{
putimage(bull.x, bull.y, &bullet);
//putimage(bull.x, bull.y, &bullet);
}
}
}
int main()
{
//初始化图形界面 640*480
initgraph(WIDTH, HEIGHT);
gameInit();
//双缓冲绘图目的,图片在不断的移动需要不断的在背景图片上绘制图片,会出现频闪,解决频闪问题
BeginBatchDraw();
while (1)
{
gameDraw();
FlushBatchDraw();//刷新
playerMove(1);
BulletMove();
}
EndBatchDraw();
return 0;
}
哥们,我是初学者,有没有什么进阶的书或项目书介绍?我初学,基础学习到了指针了,后面不知道继续深入 youtomefc 发表于 2021-8-22 21:15
哥们,我是初学者,有没有什么进阶的书或项目书介绍?我初学,基础学习到了指针了,后面不知道继续深入
跟着小甲鱼课程学呗,学完之后学数据结构,然后c++,我也还在学
页:
[1]