用Qt实现一个桌面弹幕程序(四)--实现一个弹幕③
来源:互联网 发布:windows管理模板 编辑:程序博客网 时间:2024/05/22 12:11
不同种类弹幕的实现
在上一篇文章中,杰洛君带大家实现了从屏幕右方飞行到左方的弹幕。\(^o^)/
但是弹幕并不止这一种,有很多很多不同的弹幕种类,包括但不限于:
- 顶部弹幕 – – 弹幕悬停于屏幕顶部中央一段时间
- 底部弹幕 – – 弹幕悬停在屏幕底部中央一段时间
- 逆向弹幕 – – 弹幕从屏幕的右方飞行到屏幕左方
实现起来也是非常简单的~
继续使用QPropertyAnimation作为弹幕的动画实现方式
顶部和底部弹幕:
开始位置和结束位置设置为屏幕中间即可
设置停留时间
动画结束时销毁自身
代码实现:
QPropertyAnimation * anim2=new QPropertyAnimation(this, "pos");anim2->setDuration(7000);anim2->setEasingCurve(QEasingCurve::Linear);this->setWindowOpacity(this->getTransparency()); connect(anim2,SIGNAL(finished()),this,SLOT(deleteLater()));
问题又来了,顶部弹幕和底部弹幕的坐标如何确定呢?
这两种弹幕的显示是位于屏幕中央,所以很自然可以想到 用 屏幕的宽度 - 弹幕的宽度 再 除以2 得到弹幕的横坐标位置。
但是纵坐标呢?
纵坐标位置应该和上一个弹幕位置相关,也就是说,纵坐标的位置应该为字体高度的整数倍,这样这两种弹幕的文字才能不重叠。
所以记得用两个变量来记录顶部弹幕数量和底部弹幕数量哦~
至于逆向弹幕的话就更简单了,把正向弹幕的起始位置和结束位置互换就可以了~这里就不用代码写出了~
杰洛君 怒偷一懒233O(∩_∩)O哈哈~
(p.s. Qt的动画效果有很多,感兴趣的同学可以了解一下 QEasingCurve 类 , 恩恩,就是上面代码中经常出现的 QEasingCurve::Linear 部分,在这里是用了线性,你可以切换不同的类型来体验体验他们的动画效果哦~O(∩_∩)O嗯! )
来试试动画弹幕吧~
杰洛君的弹幕是继承QLabel实现的~
而QLabel是可以播放GIF的哦~
于是乎,杰洛君 脑洞大开地想到了一个很好玩的东西~
不如让一个GIF动画飞过屏幕吧~
好吧,那就决定是你了,上吧!!! 小doge!!!
杰洛君创建了一个Doge类
基本设置和弹幕类似,但是不需要重载 paintEvent函数了~
Doge类用到了QMovie
在Doge类中杰洛君添加了一个 QMovie * movie 这个私有变量。
令他的构造函数看起来是这样子的
Doge(QWidget *parent, QMovie * movie2,QRect rect,int type = 4,double Transparency = 1.00,int runTime=15000);
初始化后
调用QLabel的 QLabel::setMovie(QMovie * movie); 函数就可以在Label上显示GIF了~
所以在这里movie2的创建是在Doge类外部的。
在构造函数中movie2的值会赋值给私有变量movie,自然在析构函数中要加上delete这个movie指针的代码,不然就内存泄露了。
QMovie 类用法
QMovie * movie = new QMovie(“:/project/rundoge”);
movie->start(); //启动动画
movie->setPaused(true); //暂停动画
movie->stop(); //停止动画
那上面代码中的”:/project/rundoge” 是什么呢?
这个是Qt中用资源文件进行管理文件时 文件的引用方式
右键点击项目可以新建资源文件,在里面可以添加项目要用到的资源文件
比如 杰洛君的项目中
我给这个gif文件 定义了前缀为 /project 别名为 rundoge
所以访问这个文件就是用 “:/project/rundoge” 进行访问啦~
还不清楚的话,可以用搜索引擎搜索一下 Qt 资源文件 学习更加详细的用法~
来试试图片弹幕吧~
除了GIF 有时一些好玩的图片也是你希望能够放上屏幕让它飞过的,比如一些图片表情(手动滑稽)
这时就可以用 QPixmap来加载图片了,与上文中的 QMovie类似,QPixmap在构造函数中传入图片资源即可。
初始化后再用 QLabel中的setPixmap(const QPixmap & )函数即可
为了让图片显示完全,设置弹幕窗体大小和图片大小一致即可,如果需要缩放 QPixmap 也有提供scaled 函数给你使用。这个函数参数比较多,快快选中它 按下F1 进行学习吧~
小 D : 感觉从上到下 说明越来越水了。。。(#‵′)凸
杰洛君 : 冤枉冤枉!重点在下面呢~
来试试图片弹幕吧~
制作一个南小鸟动画~
相信看过LoveLive的同学都知道一个非常经典的表情
它一般从画面的左下角缓慢探出头,停留在左下角一段时间,再缓慢收回去
这个如何实现呢?
没错,还是用Qt 的动画类
只不过这次不同,这里应该有三个动画 探出 停留 收回
而且这三个动画是顺序执行的,于是这里 杰洛君 就用了
QSequentialAnimationGroup类
这个类名中我们看到了Sequential 说明动画组中 动画的执行顺序是线性的,也就是有顺序,和加入组中的顺序有关,只要动画顺序加入这个组就可以了~
group = new QSequentialAnimationGroup(this); anim5=new QPropertyAnimation(this, "pos"); anim5->setDuration(100); anim5->setStartValue(QPoint(this->getPosX(),this->getPosY())); anim5->setEndValue(QPoint(this->getPosX(),this->getPosY())); anim5->setEasingCurve(QEasingCurve::Linear); anim2=new QPropertyAnimation(this, "pos"); anim2->setDuration(200); anim2->setStartValue(QPoint(this->getPosX(),this->getPosY())); anim2->setEndValue(QPoint(0, rect.height()-pic.size().rheight())); anim2->setEasingCurve(QEasingCurve::Linear); anim3=new QPropertyAnimation(this, "pos"); anim3->setDuration(500); anim3->setStartValue(QPoint(0, rect.height()-pic.size().rheight())); anim3->setEndValue(QPoint(0, rect.height()-pic.size().rheight())); anim3->setEasingCurve(QEasingCurve::Linear); anim4=new QPropertyAnimation(this, "pos"); anim4->setDuration(200); anim4->setEndValue(QPoint(this->getPosX(),this->getPosY())); anim4->setStartValue(QPoint(0, rect.height()-pic.size().rheight())); anim4->setEasingCurve(QEasingCurve::Linear); group->addAnimation(anim5); group->addAnimation(anim2); group->addAnimation(anim3); group->addAnimation(anim4);
上面的代码也是非常耿直的~
(p.s. 既然有SequentialGroup 自然也会有 QParallelAnimationGroup ,感兴趣的小伙伴可以了解一下哦~)
后续
今天带大家实现了各种各样奇葩弹幕呢~
那么弹幕的介绍大概就到这里,接下来会讲解主窗体的建立和设置。
看到未来道阻且长,杰洛君不禁一声长叹~(╯3╰) 哎~
不过我不会就这样轻易地狗带的!加油,记录自己做过的每一个程序~
- 用Qt实现一个桌面弹幕程序(四)--实现一个弹幕③
- 用Qt实现一个桌面弹幕程序(二)--实现一个弹幕①
- 用Qt实现一个桌面弹幕程序(三)--实现一个弹幕②
- 来用Qt实现一个桌面弹幕程序吧
- 用Qt实现一个桌面弹幕程序(一)--前期准备
- 用Qt实现一个桌面弹幕程序(七)-- -- 桌面客户端实现③
- 用Qt实现一个桌面弹幕程序(五)-- -- 桌面客户端实现①
- 用Qt实现一个桌面弹幕程序(六)-- -- 桌面客户端实现②
- 用Qt实现一个桌面弹幕程序(八)-- -- 桌面客户端实现④
- 用Qt实现一个桌面弹幕程序(九)-- -- 服务端的实现
- 用Qt实现一个桌面弹幕程序(十)-- -- 网页服务端的实现①
- qt实现桌面弹幕
- C语言实现一个自动刷弹幕的程序
- iOS_一个简单的弹幕实现
- 弹幕实现
- 弹幕实现
- 微信小程序实现弹幕效果
- Android下 一个自定义VIEW实现简单的弹幕效果
- Heat/ApplicationDeployment
- android:id="@id"与android:id="@+id/"的区别
- Java NIO基本使用
- 蓝桥杯—翻硬币
- 也谈JVM垃圾回收
- 用Qt实现一个桌面弹幕程序(四)--实现一个弹幕③
- 【图像处理】相机成像原理
- Android 删除手机相册中的图片
- Demo2:简单求职表格
- [017]Java设计模式3——策略模式
- Android 个人开发者接入支付功能
- Handler、Loop、MessageQueue的工作原理
- &qt;<等xml|Html转义字符
- Nagios远程监控windows方案补充说明