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

基本运动+键盘交互

  • 一.基本运动
    • 1.基本运动:
      • 1.如何实现动画:
      • 2.实现一个小球从左到右从右到左:(往返运动)
      • 3.实现一个五角星的移动:
      • 4.实现一个五角星自转和圆周运动的集合:(圆周运动)
    • 2.直线运动:
      • 1.左上左下右上右下:
      • 2.任意从一个点到一个点的直线运动。
  • 二.键盘交互
    • 1.动键盘我们的图形才移动:
    • 2.动键盘去控制原来的运动情况:

一.基本运动

1.基本运动:

1.如何实现动画:

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

帧率:具有连续性的一些图片在1秒中绘制的个数。
物体运动的速度单位一般是 像素/秒。
sleep函数:可以让我们的程序在执行到sleep函数的时候就停下自己定义的时间,sleep函数的单位是毫秒

请添加图片描述

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

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.实现一个五角星的移动:

请添加图片描述

#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.实现一个五角星自转和圆周运动的集合:(圆周运动)

#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.根据速度方向的正负求速度的符号
使用速度方向的正负确定停止条件。

//直线运动
//直线运动
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.动键盘我们的图形才移动:

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.动键盘去控制原来的运动情况:

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

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;
			}
		}



	}


}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/77485.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Opencv4基于C++基础入门笔记:图像 颜色 事件响应 图形 视频 直方图

效果图◕‿◕&#xff1a;opencv人脸识别效果图(请叫我真爱粉)✌✌✌先看一下效果图勾起你的兴趣&#xff01; 文章目录&#xff1a; 一&#xff1a;环境配置搭建 二&#xff1a;图像 1.图像读取与显示 main.cpp 运行结果 2.图像色彩空间转换 2.1 换色彩 test.h t…

java八股文面试[java基础]——String StringBuilder StringBuffer

String类型定义&#xff1a; final String 不可以继承 final char [] 不可以修改 String不可变的好处&#xff1a; hash值只需要算一次&#xff0c;当String作为map的key时&#xff0c; 不需要考虑hash改变 天然的线程安全 知识来源&#xff1a; 【基础】String、StringB…

latex 笔记:cs论文需要的排版格式

主要针对英文文献 1 基本环境 连字符 不同长度的"-"表示不同含义。 一个"-"长度的连字符用于词中两个"-"长度的连字符常用于制定范围三个"-"长度的连字符是破折号数学中的负数要用数学环境下的-得到 强调 在正式文章中, 通常不…

探索区块链世界:去中心化应用(DApp)的崭新前景

随着科技的不断发展&#xff0c;区块链技术逐渐引领着数字时代的潮流。在这个充满创新和变革的领域中&#xff0c;去中心化应用&#xff08;DApp&#xff09;成为了备受瞩目的焦点。DApp 不仅改变了传统应用程序的范式&#xff0c;还在金融、社交、游戏等多个领域展现出了广阔的…

File Upload

File Upload 文件上传功能是大部分WEB应用的常用功能&#xff0c;网站允许用户自行上传头像、照片、一些服务类网站需要用户上传证明材料的电子档、电商类网站允许用户上传图片展示商品情况等。然而&#xff0c;看似不起眼的文件上传功能如果没有做好安全防护措施&#xff0c;…

【数理知识】向量与基的内积,Matlab 代码验证

序号内容1【数理知识】向量的坐标基表示法&#xff0c;Matlab 代码验证2【数理知识】向量与基的内积&#xff0c;Matlab 代码验证 文章目录 1. 向量与基的内积2. 二维平面向量举例3. 代码验证Ref 1. 向量与基的内积 假设存在一个二维平面内的向量 a ⃗ \vec{a} a &#xff0c…

具身智能:人工智能的下一个浪潮

原创 | 文 BFT机器人 特斯拉 2023 年股东会上&#xff0c;马斯克强调了人形机器人对特斯拉未来的重要性&#xff0c;并预测其将成为公司的主要长期价值来源。他进一步表示&#xff1a;“如果人形机器人和人的比例大致为2比1&#xff0c;那么人们对机器人的需求可能达到100亿乃…

W5100S-EVB-PICO 做UDP Server进行数据回环测试(七)

前言 前面我们用W5100S-EVB-PICO 开发板在TCP Client和TCP Server模式下&#xff0c;分别进行数据回环测试&#xff0c;本章我们将用开发板在UDP Server模式下进行数据回环测试。 UDP是什么&#xff1f;什么是UDP Server&#xff1f;能干什么&#xff1f; UDP (User Dataqram …

爬虫逆向实战(十三)--某课网登录

一、数据接口分析 主页地址&#xff1a;某课网 1、抓包 通过抓包可以发现登录接口是user/login 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有一个password加密参数&#xff0c;还有一个browser_key这个可以写死不需要关心 请求头…

【Image captioning】ruotianluo/self-critical.pytorch之1—数据集的加载与使用

【Image captioning】ruotianluo/self-critical.pytorch之1—数据集的加载与使用 作者&#xff1a;安静到无声 个人主页 数据加载程序示意图 使用方法 示例代码 #%%from __future__ import absolute_import from __future__ import division from __future__ import print_…

导读-Linux简介

Linux简介 ​ 总所周知&#xff0c;计算机系统包含硬件和软件两部分。硬件部分被称为裸机&#xff0c;主要包括中央处理器&#xff08;CPU&#xff09;、内存、外存和各种外部设备。软件部分主要包括系统软件和应用软件两部分。系统软件包括操作系统、汇编语言、编译程序、数据…

AD域控制器将辅域控制器角色提升为主域控制器

背景 域控服务器迁移&#xff0c;已将新机器添加为该域的辅域控制器。 主域控制器&#xff1a;test-dc-01 辅域控制器&#xff1a;test-dc-02 需求将主辅域的角色进行互换&#xff0c;test-dc-01更换为辅域&#xff0c;test-dc-02更换为主域。 操作步骤 方法1 命令行修改AD域…

2023国赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

ubuntu16编译内核源码并替换

文章目录 1.找到和ubuntu内核版本相同的内核源码包2.下载下面三个文件3.相关步骤4.安装编译环境软件参考&#xff1a; 1.找到和ubuntu内核版本相同的内核源码包 4.15.0-112.113 : linux package : Ubuntu (launchpad.net) 2.下载下面三个文件 3.相关步骤 uname -r #查看内核…

python3实现线性规划求解

Background 对于数学规划问题&#xff0c;有很多的实现。MatlabYALMIPCPLEX这个组合应该是比较主流的&#xff0c;尤其是在电力相关系统中占据着比较重要的地位。MATLAB是一个强大的数值计算工具&#xff0c;用于数学建模、算法开发和数据分析。Yalmip是一个MATLAB工具箱&#…

阿里云Alibaba Cloud Linux镜像系统介绍_常见问题解答FAQ

阿里云服务器操作系统Alibaba Cloud Linux镜像怎么样&#xff1f;可以代替CentOS吗&#xff1f;Alibaba Cloud Linux兼容性如何&#xff1f;有人维护吗&#xff1f;漏洞可以修复吗&#xff1f;Alibaba Cloud Linux完全兼容CentOS&#xff0c;并由阿里云官方免费提供长期维护。 …

【不带权重的TOPSIS模型详解】——数学建模

目录索引 定义&#xff1a;问题引入&#xff1a;不合理之处&#xff1a;进行修改&#xff1a; 指标分类&#xff1a;指标正向化&#xff1a;极小型指标正向化公式&#xff1a;中间型指标正向化公式&#xff1a;区间型指标正向化公式&#xff1a; 标准化处理(消去单位)&#xff…

UML-时序图

目录 时序图 时序图构成: 对象: 消息: 生命线(激活): 活动条: 时序图举例: 时序图 时序图也叫顺序图、序列图. 时序图描述按照时间的先后顺序对象之间的动作过程&#xff0c;是由生命线和消息组成 时序图构成: 对象: 对象是类的实例&#xff0c;对象是通过类来创建的&…

远程桌面配置指南:保留TCP地址、配置隧道和使用固定TCP地址

远程桌面配置指南&#xff1a;保留TCP地址、配置隧道和使用固定TCP地址 文章目录 远程桌面配置指南&#xff1a;保留TCP地址、配置隧道和使用固定TCP地址第一步&#xff1a;保留TCP地址第二步&#xff1a;为远程桌面隧道配置固定的TCP地址第三步&#xff1a;使用固定TCP地址远程…

前端练手小项目--自定义时间(html+css+js)

自定义时间 写文章的因 关于要写这篇文章的原因 是记录在工作上遇到的困难需求&#xff0c;是希望能给大家提供一些解决问题的思路 接下来我描述这个需求的多样性&#xff0c;难点在哪。 勾选勾选框开始时间与结束时间默认显示昨天与今天。取消勾选框开始时间与结束时间清空。…