不同种类弹幕的实现
在上一篇文章中,杰洛君带大家实现了从屏幕右方飞行到左方的弹幕。\(^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 部分,在这里是用了线性,你可以切换不同的类型来体验体验他们的