再上一个例子当中,我们可以让小球无限的运动反弹,细心的同学再修改代码时候可能会发现,当我们把间隔时间缩短(如Sleep(5))让小球运动变快的时候,会发现小球运动过程中的闪烁比较明显,似乎看着有些不够细腻。


这就是画图本身刷新帧率导致的,由于easyX每次绘制图片都会有开销,当间隔太短,就会出现延迟,产生这种问题。那么解决办法也是有的,easyX提供了批量绘制的函数,即将每一次绘图相关的操作之后可以不立马执行,而是等需要显示的时候一次性绘图显示

void BeginBatchDraw(); //开始批量绘图。执行后,任何绘图操作都将暂时不输出到绘图窗口上
                        //直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。
void FlushBatchDraw();   //开始将前面未绘制的图形一次性绘制
void EndBatchDraw();  //结束批量绘图


这三个函数我们将BeginBatchDraw()放到循环开始,EndBatchDraw();放到循环结束,FlushBatchDraw()放到绘圆之后就可以减少这种闪烁的情况。

完整代码如下:

//弹球游戏
//www.dotcpp.com
#include <graphics.h>        // 引用图形库头文件
#include <conio.h>
 
#define WIDTH 640
#define HIGH 480
#define R 10
int main()
{
    int i;
	int Vx=5,Vy=5;
    int x=WIDTH/2,y=HIGH/2;                //表示小球的圆心坐标
    initgraph(WIDTH, HIGH);    // 创建绘图窗口,大小为 640x480 像素
    BeginBatchDraw();
	while(1)
    {  
        //绘制小球图案
        setfillcolor(GREEN);   
        fillcircle(x,y,R);
		FlushBatchDraw();
        Sleep(5);
        //原位置擦除小球图案
        setcolor(BLACK);
        setfillcolor(BLACK);
        fillcircle(x,y,R);
        
        x=x+Vx;
        y=y+Vy;
		if(x<=R || x>=WIDTH-R)
			Vx=-Vx;
		if(y<=R || y>=HIGH-R)
			Vy=-Vy;
    }
    EndBatchDraw();
    getch();                // 按任意键继续
    closegraph();           // 关闭绘图窗口
    return 0;
}


运行后参考效果:

小球碰撞优化后


请大家参考并尝试运行、观察比对效果~

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)