easyx图形库基础:2.基本运动+键盘交互

基本运动+键盘交互

一.基本运动

1.基本运动:

1.如何实现动画:

相信大家已经对动画的原理已经不陌生了。想要目标物体动起来,只需要逐个播放目标物体每一时刻位置的图片。只要播放的速度足够快,人们就会在视觉上认为目标物体动起来了。

帧率:具有连续性的一些图片在1秒中绘制的个数。

物体运动的速度单位一般是 像素/秒。

sleep函数:可以让我们的程序在执行到sleep函数的时候就停下自己定义的时间,sleep函数的单位是毫秒。

2.实现一个小球从左到右从右到左:(往返运动)

c 复制代码
void moveball()
{
	int x = -400;
	int y = 0;
	//设置小球的每一次移动的距离
	int vx = 5;
	setfillcolor(RGB(90, 164, 174));
	while (1)
	{
		//绘制小球
		solidcircle(x, y, 25);
		Sleep(40);
		//判断小球转方向。
		if (x >= 400 || x<-400)
		{
			vx = -vx;
		}
		//进行坐标值的变化;
		x += vx;
		cleardevice();
	}
}

3.实现一个五角星的移动:

c 复制代码
#define PI 3.14
void star()
{
	POINT st[5];

	int x = -400;
	int y = 0;

	int vx = 5;
	int r = 30;

	double rad = PI / 180;

	while (1)
	{
		cleardevice();
		setfillcolor(YELLOW);
		//设置五角星的坐标
		for (int i = 0; i < 5; i++)
		{
			st[i].x = x + r * sin( rad* (144 * i));
			st[i].y = y + r * cos( rad* (144 * i));
		}
		//绘制五角星
		solidpolygon(st,5);
		Sleep(40);
		//判断五角星转方向。
		if (x >= 400 || x < -400)
		{
			vx = -vx;
		}
		//进行坐标值的变化;
		x += vx;
	}
}

4.实现一个五角星自转和圆周运动的集合:(圆周运动)

c 复制代码
#define PI 3.14

void star()
{
	POINT st[5];

	int x = 0;
	int y = 0;
	
	//大圆周半径
	int R = 200;
	//小圆周半径
	int r = 50;

	double rad = PI / 180;
	int j = 0;
	while (1)
	{
		cleardevice();
		setfillcolor(YELLOW);

		//五角星的x,y坐标
		
		x = R * sin(rad * j);
		y = R * cos(rad * j);

		//设置五角星的坐标,初始化角度值可以变化。
		for (int i = 0; i < 5; i++)
		{
			st[i].x = x + r * sin( rad* ((144 * i)+j));
			st[i].y = y + r * cos( rad* ((144 * i)+j));
		}
		//绘制五角星
		solidpolygon(st,5);
		Sleep(40);

		j++;
		if (j == 359)
		{
			j = 0;
		}
	}
}

2.直线运动:

1.左上左下右上右下:

  1. P1到P2
    圆形从P1运动到P2。由于是直线运动,速度与位移的方向是相同的,均是从P1到P2。此时,速度方向
    并不是水平或垂直的。但是,我们可以通过三角函数计算出速度在x方向与y方向的速度分量。为了计算出速度分量,还需要先求出速度方向与x轴的夹角θ。

2.任意从一个点到一个点的直线运动。

1.使用三角函数和反三角函数计算角度

2.根据三角函数计算速度分量

3.根据速度方向的正负求速度的符号

使用速度方向的正负确定停止条件。

c 复制代码
//直线运动
//直线运动
void straight_line(int x1,int y1,int x2,int y2,int v)
{
	//求角度
	double ran = (double)abs(y2 - y1) / (double)abs(x2 - x1);
	double th = atan(ran);
	//给速度分量赋值
	double vx = v * cos(th);
	double vy = v * sin(th);
	//判断运动方向
	int flagvx = 0;
	int flagvy = 0;

	if (x2 - x1 < 0)
	{
		flagvx = -1;
	}
	else if (x2 - x1 > 0)
	{
		flagvx = 1;
	}
	if (y2 - y1 < 0)
	{
		flagvy = -1;
	}
	else if (y2 - y1 > 0)
	{
		flagvy = 1;
	}

	vx = vx*flagvx;
	vy = vy*flagvy;

	//初始化位置
	double x = x1;
	double y = y1;


	while (1)
	{
		cleardevice();
		solidcircle(x, y, 30);
		Sleep(40);

		x += vx;
		y += vy;


		//判断循环结束条件
		if (flagvx == 1)
		{
			if (x >= x2)
				break;
		}
		else if (flagvx == -1)
		{
			if (x <= x2)
				break;
		}

		if (flagvy == 1)
		{
			if (y >= y2)
				break;
		}
		else if (flagvy == -1)
		{
			if (y <= y2)
				break;
		}

	}
}
}

二.键盘交互

因为kbhit和getch是不是标准库的内容他是平台实现函数然后为了进行区分就在函数名称前面加上了一个_.

头文件是conio.h

1.动键盘我们的图形才移动:

c 复制代码
void contour()
{
	//初始化坐标和水平竖直速度
	int x = 0;
	int y = 0;

	int vx = 0;
	int vy = 0;


	while (1)
	{
		//conio.h是getch函数的头文件,
		//这个函数可以直接获取输入缓冲区的字符不需要回车确认
		cleardevice();
		solidcircle(x, y, 30);

		//获取键盘输入字符
		char ch=_getch();
		switch (ch)
		{
			case'A':
			case'a':
				vx = -5;
				vy = 0;
				break;
			case'S':
			case's':
				vy = -5;
				vx = 0;
				break;
			case'W':
			case'w':
				vy = 5;
				vx = 0;
				break;
			case'D':
			case'd':
				vx = 5;
				vy = 0;
				break;
		}
		x += vx;
		y += vy;
	}

}

2.动键盘去控制原来的运动情况:

默认我们的图形开始是从左向右运动的,我们键盘输入数据才移动。

c 复制代码
void movecontour()
{
	//初始化坐标和水平竖直速度
	int x = 0;
	int y = 0;

	int vx = 5;
	int vy = 0;


	while (1)
	{
		//conio.h是getch函数的头文件,
		//这个函数可以直接获取输入缓冲区的字符不需要回车确认
		cleardevice();
		solidcircle(x, y, 30);
		Sleep(40);

		//获取键盘输入字符
		x += vx;
		y += vy;

		//判断输入缓冲区中是否有内容,_kbhit()不会阻塞函数。
		//如果有内容进入语句,getch获取缓冲区的数值去改变速度的值。
		if (_kbhit())
		{
			char ch = _getch();
			switch (ch)
			{
			case'A':
			case'a':
				vx = -5;
				vy = 0;
				break;
			case'S':
			case's':
				vy = -5;
				vx = 0;
				break;
			case'W':
			case'w':
				vy = 5;
				vx = 0;
				break;
			case'D':
			case'd':
				vx = 5;
				vy = 0;
				break;
			}
		}



	}


}
相关推荐
小雨下雨的雨2 小时前
Flutter鸿蒙共赢——奇异吸引子:混沌科学之痕与洛伦兹系统的数字重构
flutter·华为·重构·交互·harmonyos·鸿蒙系统
小雨下雨的雨3 小时前
Flutter鸿蒙共赢——色彩的流变:流体梯度网格与现代视觉重构
算法·flutter·华为·重构·交互·harmonyos·鸿蒙
小雨下雨的雨3 小时前
Flutter鸿蒙共赢——逻辑的繁花:初等元胞自动机与 Rule 7 的矩阵美学
线性代数·flutter·华为·矩阵·交互·harmonyos·鸿蒙系统
前天的五花肉3 小时前
D3.js研发交互模型指标柱形图
开发语言·javascript·交互
小雨下雨的雨5 小时前
Flutter鸿蒙共赢——墨染算法:柏林噪声与鸿蒙生态中的数字水墨意境
算法·flutter·华为·交互·harmonyos·鸿蒙
小雨下雨的雨1 天前
Flutter 框架跨平台鸿蒙开发 —— GridView 控件之多维网格美学
flutter·华为·交互·harmonyos·鸿蒙系统
aitoolhub1 天前
H5交互设计:从策划到上线的实用方法论与避坑要点
人工智能·计算机视觉·交互·视觉传达
小雨下雨的雨1 天前
Flutter跨平台开发实战: 鸿蒙与循环交互艺术:无限循环的 Banner 引擎
flutter·ui·华为·交互·harmonyos·鸿蒙系统
小雨下雨的雨1 天前
Flutter跨平台开发实战: 鸿蒙与循环交互艺术:虚拟列表与百万级数据性能巅峰
flutter·华为·交互·harmonyos·鸿蒙系统
小雨下雨的雨1 天前
Flutter跨平台开发实战: 鸿蒙与循环交互艺术:Sliver 视差滚动与沉浸式布局
flutter·华为·交互·harmonyos·鸿蒙系统