1.气球往上飘
我们声明两个符号常量来作为窗体的长和宽,接着就是常规操作
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#include<easyx.h>
#include<stdio.h>
int main()
{
initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
setbkcolor(WHITE);
cleardevice();
getchar();
}
接下来我们就要用彩色圆形当作气球,让5个气球从窗体的底部出现,飘到窗体的顶部后消失
那么气球是具有这么几个属性的
- 圆心坐标
- 半径
- 移动速度
那么我们就可以声明一个结构体用于保存这样几个属性数据
typedef struct
{
int x, y;
int r;
int v;
COLORREF color;
}ballon;
我们再设置两个宏
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define MAX_IN_WINDOW 5 //窗体同时出现的气球数量
#define BALLOON_RADIUS 30 //气球半径
#include<easyx.h>
#include<stdio.h>
typedef struct
{
int x, y;
int r;
int v;
COLORREF color;
}balloon;
int main()
{
initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
setbkcolor(WHITE);
cleardevice();
getchar();
}
为了记录这些气球的数据,我们声明一个结构数组来保存这些气球的数据
balloon arrBalloons[MAX_IN_WINDOW];//保存窗体内气球数据
接下来我们就可以给气球中的成员设置初始值
for (int i = 0; i < MAX_IN_WINDOW; i++)//初始化数据
{
int m, n;
m = 100;//坐标区间
n = 700;
arrBalloons[i].x = rand() % (n - m + 1) + m;//【100,700】
arrBalloons[i].y = WINDOW_HEIGHT;//圆心y设置初始值
arrBalloons[i].r = BALLOON_RADIUS;//设置圆形半径
m = 1;//速度区间
n = 3;
arrBalloons[i].v = rand() % (n - m + 1) + m;//【1,3】
arrBalloons[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
我们再设置一下帧率
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define MAX_IN_WINDOW 5 //窗体同时出现的气球数量
#define BALLOON_RADIUS 30 //气球半径
#include<easyx.h>
#include<stdio.h>
typedef struct
{
int x, y;
int r;
int v;
COLORREF color;
}balloon;
int main()
{
initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
setbkcolor(WHITE);
cleardevice();
balloon arrBalloons[MAX_IN_WINDOW];//保存窗体内气球数据
for (int i = 0; i < MAX_IN_WINDOW; i++)//初始化数据
{
int m, n;
m = 100;//坐标区间
n = 700;
arrBalloons[i].x = rand() % (n - m + 1) + m;//【100,700】
arrBalloons[i].y = WINDOW_HEIGHT;//圆心y设置初始值
arrBalloons[i].r = BALLOON_RADIUS;//设置圆形半径
m = 1;//速度区间
n = 3;
arrBalloons[i].v = rand() % (n - m + 1) + m;//【1,3】
arrBalloons[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
timeBeginPeriod(1);
LARGE_INTEGER startcount, endcount, F; //开始时闻、结束时间、频率F
QueryPerformanceFrequency(&F);
BeginBatchDraw();//获取频率F
while (1)
{
QueryPerformanceCounter(&startcount);// 获取起始计数
cleardevice();
for (int i = 0; i < MAX_IN_WINDOW; i++)//根据气球数组中的数据绘制出气球
{
setfillcolor(arrBalloons[i].color);
solidcircle(arrBalloons[i].x, arrBalloons[i].y, arrBalloons[i].r);
}
for (int i = 0; i < MAX_IN_WINDOW; i++)//将每个气球进行移动
arrBalloons[i].y -= arrBalloons[i].v;
QueryPerformanceCounter(&endcount);// 获取结束计数
long long elapse = (endcount.QuadPart - startcount.QuadPart) * 1000000 / F.QuadPart;//计算时差
while (elapse < 1000000/60)//60帧
{
Sleep(1);
QueryPerformanceCounter(&endcount);
elapse = (endcount.QuadPart - startcount.QuadPart) * 1000000 / F.QuadPart;
}
FlushBatchDraw();
}
EndBatchDraw();
timeEndPeriod(1);
getchar();
}
运行一下,发现报错了
注意timeBeginPeriod(1); timeEndPeriod(1);这两个函数是在库<winmm.lib> 里,而默认情况下链接器不会输入这个库文件
我们需要将这个库添加到工程配置的链接器输入当中
注意:这两个函数必须配对使用
很好看啊!!
2.删除已经消失的气球
我们先在主循环设置一个变量,记录当前窗体出现的小球数量
那么我们怎么判断小球已经消失了呢?
我们知道最顶端的y的值是0,小球的半径是BALLON_RADIUS,那么小球离开窗体的y的范围应该是y<=BALLON_RADIUS
我们就可以执行
那么我们现在就要重点讨论如何从数组中删除元素