Qt实现小球碰撞动画——屏保

8 篇文章 1 订阅

说明:本次设计应用Qt完成一个小动画,并且可以同用户进行交互,适合新手学习练手

功能描述:小球弹撞动画具有以下功能
1、小球可以沿着一个随机的方向运动
2、运动时可以加减速
3、随时切换小球形状(圆形,正方形,三角形)
4、碰撞到边框时镜像反弹
5、小球的运动轨迹可以实时显示,边框设置为正方形时更容易画出美丽的图案哦
6、美丽的图案还可以使用截屏保存的功能

开发环境和工具:
win10系统
Qt Creator 4.2.1 (Community)

可执行:
这里写图片描述

先看看运行效果:
(因使用第三方录屏软件,生成GIF格式之后分辨率很低,软件真实运行很清晰)
这里写图片描述

界面的设计包含:菜单栏、工具栏和状态栏
这里写图片描述

本次设计采用Qt的2D显示——图形视图框架完成动画效果,程序源码已上传到百度云,链接: https://pan.baidu.com/s/1kQruoAW11WxrEiMcWMvhag 密码: st3q

另外,发现一个有趣的flash动画:http://abowman.com/,感兴趣(WULIAO)的小伙伴可以了解一下

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
实现小球的3维移动轨迹,可以使用Qt中的OpenGL模块。具体步骤如下: 1. 创建一个Qt的OpenGL项目,并在OpenGL窗口中绘制一个小球体。 2. 定义小球的初始位置和速度,可以使用三维向量来表示。 3. 在OpenGL中使用定时器,每隔一段时间更新小球的位置和速度,同时重新绘制小球。 4. 为了实现小球的3维移动轨迹,可以让小球在三维坐标系上运动,并在每次更新位置时,将小球的位置和速度分别在三个方向上进行更新。 5. 可以在小球运动的过程中,记录小球的位置信息,以实现小球的移动轨迹。 下面是一个简单的示例代码,实现了一个小球在三维空间中的移动轨迹: ```c++ #include <QOpenGLWidget> #include <QTimer> #include <QVector3D> #include <QVector> #include <QMatrix4x4> #include <math.h> class Ball : public QOpenGLWidget { public: Ball(QWidget *parent = nullptr) : QOpenGLWidget(parent) { timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(update())); timer->start(16); pos = QVector3D(0, 0, 0); vel = QVector3D(0.1, 0.1, 0.1); radius = 0.5; } protected: void initializeGL() override { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glEnable(GL_DEPTH_TEST); } void resizeGL(int w, int h) override { glViewport(0, 0, w, h); projection.setToIdentity(); projection.perspective(45.0f, (float)w / (float)h, 0.01f, 100.0f); } void paintGL() override { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); QMatrix4x4 modelview; modelview.translate(0, 0, -2.5); modelview.rotate(rotation); modelview.translate(pos); QMatrix4x4 mvp = projection * modelview; glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_QUADS); // front face glVertex3f(-radius, -radius, radius); glVertex3f(radius, -radius, radius); glVertex3f(radius, radius, radius); glVertex3f(-radius, radius, radius); // back face glVertex3f(-radius, -radius, -radius); glVertex3f(-radius, radius, -radius); glVertex3f(radius, radius, -radius); glVertex3f(radius, -radius, -radius); // top face glVertex3f(-radius, radius, -radius); glVertex3f(-radius, radius, radius); glVertex3f(radius, radius, radius); glVertex3f(radius, radius, -radius); // bottom face glVertex3f(-radius, -radius, -radius); glVertex3f(radius, -radius, -radius); glVertex3f(radius, -radius, radius); glVertex3f(-radius, -radius, radius); // right face glVertex3f(radius, -radius, -radius); glVertex3f(radius, radius, -radius); glVertex3f(radius, radius, radius); glVertex3f(radius, -radius, radius); // left face glVertex3f(-radius, -radius, -radius); glVertex3f(-radius, -radius, radius); glVertex3f(-radius, radius, radius); glVertex3f(-radius, radius, -radius); glEnd(); } void update() override { pos += vel; if (pos.x() > 2.0 || pos.x() < -2.0) vel.setX(-vel.x()); if (pos.y() > 2.0 || pos.y() < -2.0) vel.setY(-vel.y()); if (pos.z() > 2.0 || pos.z() < -2.0) vel.setZ(-vel.z()); rotation += QVector3D(1, 1, 1); path.push_back(pos); updateGL(); } private: QTimer *timer; QVector3D pos; QVector3D vel; QVector<QVector3D> path; float radius; QMatrix4x4 projection; QVector3D rotation; }; ``` 在上述代码中,我们定义了一个Ball类,继承自QOpenGLWidget,并在其中实现小球的绘制和运动轨迹的记录。在initializeGL函数中,我们初始化OpenGL的一些状态,如背景颜色和深度测试等。在resizeGL函数中,我们设置了OpenGL视口和投影矩阵,用于将三维坐标系中的物体投影到二维屏幕上。在paintGL函数中,我们使用OpenGL绘制一个小球体。在update函数中,我们更新小球的位置和速度,并记录其运动轨迹。最后在主函数中,我们创建了一个Ball对象并显示出来。 这个示例程序的运行结果如下图所示,可以看到小球在三维空间中运动,并留下了其移动轨迹: ![ball_path](https://img-blog.csdn.net/20180315165846863)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值