EASYX实现多物体运动

eg1:单个物体运动使用easyx实现单个小球的运动

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define PI 3.14
#define NODE_WIDTH 40


int main()
{
	// 创建画布
	initgraph(800, 600);
	//将坐标轴移动到中间
	setorigin(400, 300);
	// 将坐标轴的x轴和y轴反转方向
	setaspectratio(1, -1);
	setbkcolor(RGB(164, 225, 202));
	// 清除画布
	cleardevice();
	// 定义一个int类型的圆心坐标
	int x = 0; int y = 0;
	// 小球在x 和 y方向上的速度分量
	int vx = 5; int vy = 5;
	// 小球的半径
	int r = 20;
	// 通过while循环不断的重新绘制小球
	while (1) {
	  // 清除一次画布
		cleardevice();
		// 以原点坐标为x,y然后半径为R不断的绘制小球
		solidcircle(x, y, r);
	    // 每次绘制一次休眠40毫秒
		Sleep(40);
		//  表示小球碰到或者越过上下边界后反弹
		if (y >= 300 - r || y <= -300 + r) {
			vy = -vy; // 表示的是不能操过画布规定的空间大小
		}
		if (x <= -400 + r || x >= 400 - r) {
			vx = -vx; // 表示的是不能操过画布规定的空间大小
		}
		// 在每次绘制后小球的圆心需要增加vx 或者是vy像素
		x += vx;
		y += vy;
	}


	// 延迟响应
	getchar();
	// 关闭画布
	closegraph();
	return 0;

}

eg2:多个小球的不规则运动

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define PI 3.14
#define NODE_WIDTH 40
// 定义符号常量表示小球的数量
#define NUM_OF_BALLS 1000
// 结构体的定义,定义每一个小球需要使用到的分量
typedef struct {
	// 小球圆心的x y 坐标
	int x;
	int y;
	// 小球x y方向上的速度分量
	int vx;
	int vy;
	// 小球的颜色,应该区随机值
	COLORREF color;
}ball;


int main()
{
	// 创建画布
	initgraph(800, 600);
	//将坐标轴移动到中间
	setorigin(400, 300);
	// 将坐标轴的x轴和y轴反转方向
	setaspectratio(1, -1);
	setbkcolor(WHITE);
	// 设置小球的描边颜色
	setlinecolor(BLACK);
	// 清除画布
	cleardevice();
	/*
	 	创建结构类型的数据,编写程序的过程中要避免声明自动类型的数据,
		自动类型的数组数据是存放在程序的运行栈中的内存的为程序的运行栈空间较小
		对此可以使用malloc函数向栈中申请内存空间,栈中的空间较大可以有效的避免数组
		存储空间不够的问题
	*/ 
	// ball balls[NUM_OF_BALLS];
	int r = 10;
	ball* balls = (ball*)malloc(sizeof(ball) * NUM_OF_BALLS);
	if (balls == NULL) {
		return -1;

	}
	for (int i = 0; i < NUM_OF_BALLS; i++) {
		// 随机值得区间范围
		int m, n;
		//计算圆心X的随机值x范围在【-400 + r, 400- r】
		m = -400 + r;
		n = 400 - r;
		balls[i].x = rand() % (n - m + 1) + m;
		// 计算圆心Y的随机值Y的范围在【-300 + 5 , 300-r】
		m = -300 + r;
		n = 300 - r;
		balls[i].y = rand() % (n - m + 1) + m;

		//计算小球的颜色随机值,色相范围在[0,359]之间
		balls[i].color = HSVtoRGB(float(rand() % 360), 0.8f, 0.9f);
		// 计算小球的速度大小和速度方向的随机值
		m = 3;
		n = 8;
		int v = rand() % (n - m + 1) + m;
		double theta;
		theta = rand() % 360;
		balls[i].vx = v * cos(theta * PI / 180);
		balls[i].vy = v * sin(theta * PI / 180);
	}
	// 通过while循环不断的重新绘制小球
	while (1) {
	  // 清除一次画布
		cleardevice();
		// 绘制100个小球的代码
		for (int i = 0; i < NUM_OF_BALLS; i++) {
			setfillcolor(balls[i].color);
			fillcircle(balls[i].x,balls[i].y, r);

		}
		Sleep(40);
		// 判断小球是否碰到边界,如果时就将小球反弹回来
		for (int i = 0; i < NUM_OF_BALLS; i++) {
			if (balls[i].y >= 300 - r || balls[i].y <= -300 + r) {
				balls[i].vy = -balls[i].vy;
			}
			if (balls[i].x <= -400 + r || balls[i].x >= 400 - r) {
				balls[i].vx = -balls[i].vx;
			}
			// 移动小球的位置
			balls[i].x += balls[i].vx;
			balls[i].y += balls[i].vy;
 	   }

		
	}


	// 延迟响应
	getchar();
	// 关闭画布
	closegraph();
	return 0;
}

EASYX实现多物体运动_第1张图片
eg3: 批量绘图

程序在屏幕上批量显示图像

1: 程序将图像放置在显示缓存区域中

2: 显卡将显示在缓存区中的数据绘制到屏幕

eg3:单次绘图和批量绘图演示

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define PI 3.14
#define NODE_WIDTH 40
// 定义符号常量表示小球的数量
#define NUM_OF_BALLS 1000



int main()
{
	// 创建画布
	initgraph(800, 600);
	//将坐标轴移动到中间
	setorigin(400, 300);
	// 将坐标轴的x轴和y轴反转方向
	setaspectratio(1, -1);
	setbkcolor(RGB(164, 225, 202));
	// 设置小球的描边颜色
	setlinecolor(BLACK);
	// 清除画布
	cleardevice();
	

	// 使用一个简单的案例演示批量绘图
	solidcircle(-300, 0, 20);
	Sleep(1000);
	solidcircle(-200, 0, 20);
	Sleep(1000);
	solidcircle(-100, 0, 20);
	Sleep(1000);
	solidcircle(0, 0, 20);
	Sleep(1000);
	solidcircle(100, 0, 20);
	Sleep(1000);
	solidcircle(200, 0, 20);
	Sleep(1000);
	solidcircle(300, 0, 20);
	Sleep(1000);
	
	getchar();
	// 关闭画布
	closegraph();
	return 0;

}

EASYX实现多物体运动_第2张图片
使用代码对后面的四个圆形作为一个批次进行处理,前三个作为单次进行处理
函数BeginBatchDraw可以开启批量绘图模式,使用批量绘图后绘图操作将不会被送到显示缓存区,函数ENDBatchDraw可以结束批量绘图
EASYX实现多物体运动_第3张图片
具体代码如下所示:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define PI 3.14
#define NODE_WIDTH 40
// 定义符号常量表示小球的数量
#define NUM_OF_BALLS 1000



int main()
{
	// 创建画布
	initgraph(800, 600);
	//将坐标轴移动到中间
	setorigin(400, 300);
	// 将坐标轴的x轴和y轴反转方向
	setaspectratio(1, -1);
	setbkcolor(RGB(164, 225, 202));
	// 设置小球的描边颜色
	setlinecolor(BLACK);
	// 清除画布
	cleardevice();
	BeginBatchDraw();
	// 使用一个简单的案例演示批量绘图
	solidcircle(-300, 0, 20);
	Sleep(1000);
	solidcircle(-200, 0, 20);
	Sleep(1000);

	// 引入FlashBatchDraw函数
	FlushBatchDraw();
	
	solidcircle(-100, 0, 20);
	Sleep(1000);
	solidcircle(0, 0, 20);
	Sleep(1000);
	solidcircle(100, 0, 20);
	Sleep(1000);
	
	FlushBatchDraw();
	
	solidcircle(200, 0, 20);
	Sleep(1000);
	solidcircle(300, 0, 20);
	Sleep(1000);
	EndBatchDraw();
	getchar();
	// 关闭画布
	closegraph();
	return 0;

}

EASYX实现多物体运动_第4张图片

problem:解决画面闪烁问题
通过FlushBatchDraw和EndBatchDraw与BeginBatchDraw的方式解决画面闪烁并缓解显卡压力
EASYX实现多物体运动_第5张图片

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define PI 3.14
#define NODE_WIDTH 40
// 定义符号常量表示小球的数量
#define NUM_OF_BALLS 1000
// 结构体的定义,定义每一个小球需要使用到的分量
typedef struct {
	// 小球圆心的x y 坐标
	int x;
	int y;
	// 小球x y方向上的速度分量
	int vx;
	int vy;
	// 小球的颜色,应该区随机值
	COLORREF color;
}ball;


int main()
{
	// 创建画布
	initgraph(800, 600);
	//将坐标轴移动到中间
	setorigin(400, 300);
	// 将坐标轴的x轴和y轴反转方向
	setaspectratio(1, -1);
	setbkcolor(WHITE);
	// 设置小球的描边颜色
	setlinecolor(BLACK);
	// 清除画布
	cleardevice();
	/*
		创建结构类型的数据,编写程序的过程中要避免声明自动类型的数据,
		自动类型的数组数据是存放在程序的运行栈中的内存的为程序的运行栈空间较小
		对此可以使用malloc函数向栈中申请内存空间,栈中的空间较大可以有效的避免数组
		存储空间不够的问题
	*/
	// ball balls[NUM_OF_BALLS];
	int r = 10;
	ball* balls = (ball*)malloc(sizeof(ball) * NUM_OF_BALLS);
	if (balls == NULL) {
		return -1;

	}
	for (int i = 0; i < NUM_OF_BALLS; i++) {
		// 随机值得区间范围
		int m, n;
		//计算圆心X的随机值x范围在【-400 + r, 400- r】
		m = -400 + r;
		n = 400 - r;
		balls[i].x = rand() % (n - m + 1) + m;
		// 计算圆心Y的随机值Y的范围在【-300 + 5 , 300-r】
		m = -300 + r;
		n = 300 - r;
		balls[i].y = rand() % (n - m + 1) + m;
	
		//计算小球的颜色随机值,色相范围在[0,359]之间
		balls[i].color = HSVtoRGB(float(rand() % 360), 0.8f, 0.9f);
		// 计算小球的速度大小和速度方向的随机值
		m = 3;
		n = 8;
		int v = rand() % (n - m + 1) + m;
		double theta;
		theta = rand() % 360;
		balls[i].vx = v * cos(theta * PI / 180);
		balls[i].vy = v * sin(theta * PI / 180);
	}
	// 通过while循环不断的重新绘制小球
	// 解决画面闪烁问题,在绘制循环开始前调用BeginBatchDraw函数开启批量绘图
	BeginBatchDraw();
	while (1) {
		// 清除一次画布
		cleardevice();
		// 绘制100个小球的代码
		for (int i = 0; i < NUM_OF_BALLS; i++) {
			setfillcolor(balls[i].color);
			fillcircle(balls[i].x, balls[i].y, r);
	
		}
		// 当累积绘图达到1000个小球时,将当前累积的绘图作为一帧画面进行批量绘图
		FlushBatchDraw();
		Sleep(40);
		// 判断小球是否碰到边界,如果时就将小球反弹回来
		for (int i = 0; i < NUM_OF_BALLS; i++) {
			if (balls[i].y >= 300 - r || balls[i].y <= -300 + r) {
				balls[i].vy = -balls[i].vy;
			}
			if (balls[i].x <= -400 + r || balls[i].x >= 400 - r) {
				balls[i].vx = -balls[i].vx;
			}
			// 移动小球的位置
			balls[i].x += balls[i].vx;
			balls[i].y += balls[i].vy;
		}
	
	}
	// 绘制循环结束调用EenBatchDraw()函数结束批量绘图
	EndBatchDraw();
	
	// 延迟响应
	getchar();
	// 关闭画布
	closegraph();
	return 0;

}

EASYX实现多物体运动_第6张图片

你可能感兴趣的:(c语言,EASYX,EASTX,easex,visual,code)