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; //开始时闻、结束时间、频率FQueryPerformanceFrequency(&F);BeginBatchDraw();//获取频率Fwhile (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
我们就可以执行
那么我们现在就要重点讨论如何从数组中删除元素