如图 easyX是EasyX是针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022。现在笔者分享一下应用,让大家对easyX有更多了解。
easyX绘制一个小球比较简单,在创建窗口后只需要:
fillcircle(x, y, r);//(x,y)为绘制的圆心坐标,r为半径
这次展示的目标是抛物线运动会反弹的小球,我们来思考这是怎样实现的。
首先是抛物线运动,需要小球初始坐标和水平运动的初速度以及环境的加速度。先绘制600x600的窗口,画出小球,while(1)循环,绘制出新的位置的小球。需要注意两点,首先cleardevice()的作用是清屏,不然窗口原来的小球会一直存在(也可以用来观察平抛运动的轨迹);第二点是需要Sleep(10)来暂停一段时间,相当于平抛运动中的t(时间),不然以计算机的执行速度,小球会立刻消失。
#include <easyx.h>
#include <stdio.h>
int main()
{
float x, y, vx, vy, g;
x = 100; // 小球的x坐标
y = 200; // 小球的y坐标
vx = 8; // 小球x方向速度
vy = 0; // 小球y方向速度
g = 0.3; // 小球加速度,y方向
initgraph(600, 600); // 初始游戏窗口画面,宽600,高600
while (1) // 一直循环运行
{
cleardevice(); // 清除掉之前绘制的内容
vy = vy + g; // 利用加速度g更新vy速度
x = x + vx; // 利用x方向速度vx更新x坐标
y = y + vy; // 利用y方向速度vy更新y坐标
fillcircle(x, y, 20); // 在坐标(x,y)处画一个半径为20的圆
Sleep(10); // 暂停10毫秒
}
getchar(); // 等待按键
closegraph(); // 关闭窗口
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6fcae9e84fe199d09c593204c0572859.png)
那么如何实现反弹呢?只需要修改方向即可
if (y >= 580) // 当碰到地面时
{
vx = vx; // x方向速度受阻尼影响变小
vy = -1*vy; // y方向速度改变方向,并受阻尼影响变小
}
if (y > 580) // 防止小球越过地面
y = 580;
if (x >= 580) // 碰到右边墙,小球x方向速度反向
vx = -vx;
if (x <= 20) // 碰到左边墙,小球x方向速度反向
vx = -vx;
合并有下面代码:
#include <easyx.h>
#include <stdio.h>
int main()
{
float x, y, vx, vy, g; // 定义一些变量
x = 100; // 小球的x坐标
y = 200; // 小球的y坐标
vx = 8; // 小球x方向速度
vy = 0; // 小球y方向速度
g = 0.3; // 小球加速度,y方向
initgraph(600, 600); // 初始游戏窗口画面,宽600,高600
while (1) // 一直循环运行
{
cleardevice(); // 清除掉之前绘制的内容
vy = vy + g; // 利用加速度g更新vy速度
x = x + vx; // 利用x方向速度vx更新x坐标
y = y + vy; // 利用y方向速度vy更新y坐标
if (y >= 580) // 当碰到地面时
{
vx = vx;
vy = -1*vy; // y方向速度改变方向
}
if (y > 580) // 防止小球越过地面
y = 580;
if (x >= 580) // 碰到右边墙,小球x方向速度反向
vx = -vx;
if (x <= 20) // 碰到左边墙,小球x方向速度反向
vx = -vx;
fillcircle(x, y, 20); // 在坐标(x,y)处画一个半径为20的圆
Sleep(10); // 暂停10毫秒
}
_getch(); // 等待按键
closegraph(); // 关闭窗口
return 0;
}
缺点与不足:fillcircle()这个绘制小球的函数参数需要是整数,因此在应用时会截去小数部分,使得小球即使没有阻尼也会在y轴上逐渐停下来。
效果视频如下:
easyX抛物线运动会反弹的小球