EasyX简易动画——降落的标线和弹力球动画(儿时桌面的屏保)

向右移动的球

#include<graphics.h>
#include<conio.h>
#include<windows.h>

int main()
{
	initgraph(640, 480);
	for(int x = 100; x < 540; x += 20)
	{
		setcolor(RED);
		setfillcolor(YELLOW);
		fillcircle(x, 100, 20);
		Sleep(200);
		setcolor(BLACK);		//擦掉之前的球
		setfillcolor(BLACK);
		fillcircle(x, 100, 20);
	}
	closegraph();
	return 0;
}

在这里插入图片描述
移动的间距小、延时短,动画就会越细腻。但当画面较复杂时,会带来画面的闪烁(怎样消除闪烁是以后的话题)。

变式1:移动的线

#include<graphics.h>
#include<conio.h>

void main()
{
	initgraph(640, 480);
	setlinestyle(PS_SOLID, 5);		//画实线,宽度为两像素
    for(int y = 0; y < 480; y++)
    {
        // 绘绿色线
        setcolor(GREEN);
        line(0, y, 639, y);

         // 延时
         Sleep(10);

         // 绘黑色线(即擦掉先前画的绿线)
         setcolor(BLACK);
         line(0, y, 639, y);
     }

     closegraph();
}

在这里插入图片描述

反弹球动画

#include<graphics.h>
#include<conio.h>
#include<windows.h>

#define high 480.0
#define width 640.0

int main()
{
	float x, y;
	float vx, vy;
	float radius;

	initgraph(width, high);
	x = width / 2.0;
	y = high / 2.0;
	vx = 1.0;
	vy = 1.0;
	radius = 20.0;

	while(1)
	{
		setcolor(BLACK);
		setfillcolor(BLACK);
		fillcircle(x, y, radius);

		x = x + vx;
		y = y + vy;

		if((x < radius) || (x >= width - radius))
			vx = -vx;
		if((y <= radius) || (y >= high - radius))
			vy = -vy;

		setcolor(YELLOW);
		setfillcolor(RED);
		fillcircle(x, y, radius);
		Sleep(3);
	}
	closegraph();
	return 0;
}

在这里插入图片描述
sleep()函数延时越小,动画越细腻!!!

灵活运用BeginBatchDraw()、FlushBatchDraw()、EndBatchDraw()可以解决画面闪烁问题

#include<graphics.h>
#include<conio.h>
#include<windows.h>

#define high 480.0
#define width 640.0

int main()
{
	float x, y;
	float vx, vy;
	float radius;

	initgraph(width, high);
	x = width / 2.0;
	y = high / 2.0;
	vx = 1.0;
	vy = 1.0;
	radius = 20.0;

	BeginBatchDraw();					//开始批量绘
	while(1)
	{
		setcolor(BLACK);
		setfillcolor(BLACK);
		fillcircle(x, y, radius);

		x = x + vx;
		y = y + vy;

		if((x < radius) || (x >= width - radius))
			vx = -vx;
		if((y <= radius) || (y >= high - radius))
			vy = -vy;

		setcolor(YELLOW);
		setfillcolor(RED);
		fillcircle(x, y, radius);

		FlushBatchDraw();			//批量绘

		Sleep(2);
	}
	EndBatchDraw();					//结束批量绘
	closegraph();
	return 0;
}

在这里插入图片描述

多弹球治愈动画

妈妈再也不用担心我睡不着觉了

在这里插入图片描述

#include<graphics.h>
#include<conio.h>
#include<windows.h>

#define high 480 
#define width 640 
#define Num 5

int main()
{
	float x[Num], y[Num];
	float vx[Num], vy[Num];
	float radius;
	int i;
	radius = 20;

	for(i = 0; i < Num; i++)
	{
		x[i] = (i + 2) * radius * 3;
		y[i] = high / 2;
		vx[i] = 1;
		vy[i] = 1;
	}

	initgraph(width, high);
	BeginBatchDraw();

	while(1)
	{
		setcolor(BLACK);
		setfillcolor(BLACK);
		for(i = 0; i < Num; i++)
			fillcircle(x[i], y[i], radius);
		for(i = 0; i < Num; i++)
		{
			x[i] = x[i] + vx[i];
			y[i] = y[i] + vy[i];
		}
		for(i = 0; i < Num; i++)
		{
			if(x[i] <= radius || x[i] >= width - radius)
				vx[i] = -vx[i];
			if(y[i] <= radius || y[i] >= high - radius)
				vy[i] = -vy[i];
		}
		setcolor(YELLOW);
		setfillcolor(RED);
		for(i = 0; i < Num; i++)
			fillcircle(x[i], y[i], radius);

		FlushBatchDraw();

		Sleep(2);
	}
	EndBatchDraw();
	closegraph();
	return 0;
}

终极版(桌面弹球)

在这里插入图片描述

#include<graphics.h>
#include<conio.h>
#include<math.h>
#include<windows.h>

#define high 480						//长
#define width 640						//宽
#define Num 5							//球的数目

int main()
{
	float x[Num], y[Num];				//球的方位
	float vx[Num], vy[Num];				//球的速度
	float radius;						//球的半径
	int i, j;
	radius = 20;

	for(i = 0; i < Num; i++)
	{
		x[i] = rand() % int(width - 4 * radius) + 2 * radius;
		y[i] = rand() % int(high - 4 * radius) + 2 * radius;
		vx[i] = (rand() % 2) * 2 - 1;
		vy[i] = (rand() % 2) * 2 - 1;
	}

	initgraph(width, high);
	BeginBatchDraw();

	while(1)
	{
		setcolor(BLACK);
		setfillcolor(BLACK);
		for(i = 0; i < Num; i++)
			fillcircle(x[i], y[i], radius);

		for(i = 0; i < Num; i++)		//不让小球超出边界
		{
			x[i] += vx[i];
			y[i] += vy[i];
			
			if(x[i] < radius)
				x[i] = radius;
			if(y[i] < radius)
				y[i] = radius;
			if(x[i] > width - radius)
				x[i] = width - radius;
			if(y[i] > high - radius)
				y[i] = high - radius;
		}

		for(i = 0; i < Num; i++)		//是否跟墙碰撞
		{
			if(x[i] <= radius || x[i] >= width - radius)
				vx[i] = -vx[i];
			if(y[i] <= radius || y[i] >= high - radius)
				vy[i] = -vy[i];
		}

		float min[Num][2];			//两小球间的min距离,以及几号球
		for(i = 0; i < Num; i++)
		{
			min[i][0] = 9999999;
			min[i][1] = -1;
		}

		for(i = 0; i < Num; i++)
		{
			for(j = 0; j < Num; j++)
			{
				if(i != j)
				{
					float dist2;				//两球距离平方和
					dist2 = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
					if(dist2 < min[i][0])
					{
						min[i][0] = dist2;			//i球和j球min距离
						min[i][1] = j;
					}
				}
			}
		}

		for(i = 0; i < Num; i++)
		{
			if(min[i][0] <= 2 * radius * radius)	
			{							//min距离小于阈value,就发生碰撞
										//由于编辑器乱码,所以有些字我不得不用英文代替,还请见谅
				j = min[i][1];			
				int tmp;
				tmp = vx[i];
				vx[i] = vx[j];
				vx[j] = tmp;
				tmp = vy[i];
				vy[i] = vy[j];
				vy[j] = tmp;

				min[j][0] = 9999999;			//防速度又交换回来
				min[j][1] = -1;
			}
		}
		setcolor(YELLOW);
		setfillcolor(RED);
		for(i = 0; i < Num; i++)
			fillcircle(x[i], y[i], radius);
		FlushBatchDraw();
		Sleep(2);
	}
	EndBatchDraw();
	closegraph();
	return 0;
}



特别版(护眼屏保)

在这里插入图片描述

#include<graphics.h>
#include<conio.h>
#include<math.h>
#include<windows.h>

#define high 480						//长
#define width 640						//宽
#define Num 5							//球的数目

int main()
{
	float x[Num], y[Num];				//球的方位
	float vx[Num], vy[Num];				//球的速度
	float radius;						//球的半径
	int i, j;
	radius = 20;

	for(i = 0; i < Num; i++)
	{
		x[i] = rand() % int(width - 4 * radius) + 2 * radius;
		y[i] = rand() % int(high - 4 * radius) + 2 * radius;
		vx[i] = (rand() % 2) * 2 - 1;
		vy[i] = (rand() % 2) * 2 - 1;
	}

	initgraph(width, high);
	BeginBatchDraw();
	setbkcolor(YELLOW);
	while(1)
	{
		setcolor(YELLOW);
		setfillcolor(YELLOW);
		for(i = 0; i < Num; i++)
			fillcircle(x[i], y[i], radius);

		for(i = 0; i < Num; i++)		//不让小球超出边界
		{
			x[i] += vx[i];
			y[i] += vy[i];
			
			if(x[i] < radius)
				x[i] = radius;
			if(y[i] < radius)
				y[i] = radius;
			if(x[i] > width - radius)
				x[i] = width - radius;
			if(y[i] > high - radius)
				y[i] = high - radius;
		}

		for(i = 0; i < Num; i++)		//是否跟墙碰撞
		{
			if(x[i] <= radius || x[i] >= width - radius)
				vx[i] = -vx[i];
			if(y[i] <= radius || y[i] >= high - radius)
				vy[i] = -vy[i];
		}

		float min[Num][2];			//两小球间的min距离,以及几号球
		for(i = 0; i < Num; i++)
		{
			min[i][0] = 9999999;
			min[i][1] = -1;
		}

		for(i = 0; i < Num; i++)
		{
			for(j = 0; j < Num; j++)
			{
				if(i != j)
				{
					float dist2;				//两球距离平方和
					dist2 = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
					if(dist2 < min[i][0])
					{
						min[i][0] = dist2;			//i球和j球min距离
						min[i][1] = j;
					}
				}
			}
		}

		for(i = 0; i < Num; i++)
		{
			if(min[i][0] <= 2 * radius * radius)	
			{							//min距离小于阈value,就发生碰撞
										//由于编辑器乱码,所以有些字我不得不用英文代替,还请见谅
				j = min[i][1];			
				int tmp;
				tmp = vx[i];
				vx[i] = vx[j];
				vx[j] = tmp;
				tmp = vy[i];
				vy[i] = vy[j];
				vy[j] = tmp;

				min[j][0] = 9999999;			//防速度又交换回来
				min[j][1] = -1;
			}
		}
		setcolor(CYAN);
		setfillcolor(GREEN);
		for(i = 0; i < Num; i++)
			fillcircle(x[i], y[i], radius);
		FlushBatchDraw();
		Sleep(2);
	}
	EndBatchDraw();
	closegraph();
	return 0;
}



如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持,文章持续更新中!!!

  • 13
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值