所有分类
  • 所有分类
  • 后端开发
弹幕播放器新玩法:滚动+静止,让弹幕不再被忽视

弹幕播放器新玩法:滚动+静止,让弹幕不再被忽视

这个项目主要是使用了canvas进行文字绘制以及实现文字的缓动动画,主要用到的方法有

嘿各位,今天咱来聊个好玩的话题,那就是弹幕播放器的源代码。那些网上找得到的源代码大多只有滚动的弹幕功能,不过,我给它加了静止弹幕的功能~

为啥要有静止弹幕?这问题可不小!别小瞧了它,它实际上能帮咱们更好地展示字面信息。想想,光有滚动弹幕的话,重要的东西还不得被忽视掉呀。

var c=document.getElementById("cv_video");
//获取画布大小
var c_height=c.height;
var c_width=c.width;
//获取画布
ctx=c.getContext("2d");
//设置字体样式
ctx.font="25px DengXian";
画布信息已经获取和设置,巧妇难为无米之炊,接着我们就要构造弹幕对象,使用的构造模式是动态原型模式
//弹幕对象
function Barrage(content,color,type,speed){
    this.content=content;
    this.color=color;
    this.type=type;
    this.speed=speed;
    if(this.type=="default"){
        this.height=parseInt(Math.random()*c_height)+10;
    }else if (this.type=="static top"){
        this.height=parseInt((c_height/2)-Math.random()*c_height/2)+10;
    }else if (this.type=="static bottom"){
        this.height=parseInt((c_height/2)+Math.random()*c_height/2)+10;
    }
    if(typeof this.move!="function"){
        Barrage.prototype.move=function(){
            if(this.type=="default"){
                this.left=this.left-this.speed;
            }
        }
    }
}

那咋办?我这儿有个超绝妙的主意可以告诉你!首先得明白,整个播放器里最关键的部分其实是画字和字幕的过场动画。不过可惜,在canvas里面对文字的动画支持不行。怎么办?咱们就得自己动手!其实很简单,换句话说就是不停地刷新屏幕再重新写字就行了!只要刷新的速度能达到每秒钟24下(业界标准),就也能享受到流畅的动画效果!

下面说一下新问题:你觉得怎么样才能让弹幕播放器变得更像真的播放器?我这儿有个点子绝对能让你眼前一亮!只需把canvas标签的位置设成绝对定位,那么视频和画布就能叠加在一起。这样一改,不就跟真正的弹幕播放器一样!

弹幕播放器新玩法:滚动+静止,让弹幕不再被忽视

//循环擦写画布实现动画效果
setInterval(function(){
    ctx.clearRect(0,0,c_width,c_height);
    ctx.save();
    for(var i=0;i<msgs.length;i++){
        if(msgs[i]!=null){
            if(msgs[i].type=="default"){
                handleDefault(msgs[i]);
            }else{
                handleStatic(msgs[i]);
           }
        }
    }
},20)

知道么,做弹幕还挺复杂的,得考虑好多东西!比如内容啊、颜色啊、运动方式和速度啦什么的,还有那个control move()的方法,每次用它,弹幕就能拉近一点点了。

//处理默认弹幕样式
function handleDefault(barrage){
    if(barrage.left==undefined||barrage.left==null){
        barrage.left=c.width;
    }else{
         if(barrage.left<-200){
            barrage=null;
        }else{
            barrage.move()
            ctx.fillStyle=barrage.color;
            ctx.fillText(barrage.content,barrage.left,barrage.height)
            ctx.restore();
        }
    }  
}

你知道吗?做动画时擦写真的很关键!每个20毫秒我们就得擦一下屏幕(用ctx.clearRect(0,0,c_width,c_height)把绘画区域整个清了)。然后,咱们就要去找那个正在滚动的弹幕列表了(msg就是弹幕列表,每发一次弹幕,这份长长的list里就多了一个实例)。

来聊聊下一个话题。你们知不知道?这些弹幕虽然不动,但是也会消失的!所以咱们得设个时间点来借助它消失。这次不借用多余属性了,就直接用左边这个位置做标记。跟之前一样,我们要让左移,但是不会改变画布。等到了某个程度,咱们就用ctx.clearRect()函数清理掉弹幕。

//处理静止弹幕样式
function handleStatic(barrage){
    ctx.moveTo(c_width/2,barrage.height);
    ctx.textAlign="center";
    ctx.fillStyle=barrage.color;
    ctx.fillText(barrage.content,c_width/2,barrage.height);
    if(barrage.left==undefined||barrage.left==null){
        barrage.left=c.width;
    }else{
        if(barrage.left<-200){
            ctx.fillText("",c_width/2,barrage.height);                
            barrage=null;
            //ctx.restore();
            ctx.clearRect(0,0,c_width,c_height);        
        }else{
            barrage.left=barrage.left-6;
        }
    }
}

问题搞定!下面我来说说答案!这个项目主要是用canvas来画字,还可以做文字的动画。关键就是要用到save()和restore()。起初这俩方法有点儿费劲,不过现在我好像明白点儿了!每次调整画布后,原有的画布就没了。所以要提前存个档。换个画布,做完事再变回来,就这么简单!今天就聊到这儿!希望你们能从中学到有益的东西。要是对弹幕播放器感兴趣的话,自己动手试试!别忘了留下评价,咱们一起探讨一下!喜欢的话,点个赞分享一波也行

原文链接:https://www.icz.com/technicalinformation/web/2024/03/11728.html,转载请注明出处~~~
0

评论0

请先
注意:请收藏好网址www.icz.com,防止失联!站内免费资源持续上传中…!赞助我们
显示验证码
没有账号?注册  忘记密码?