• 解决弹幕之间的碰撞问题


    第一次发博客有点小紧脏。
    事情开始于一周前,因为公司项目需要做一个弹幕展示的功能。室友给我推荐了一款弹幕 https://yaseng.org/jquery.barrager.js/ 插件。
    网站代码说的很详细,但是,是基于PHP端后台做的,作为一个PHP文盲,真的很无力,但是还好,大致能了解写的什么。然后又遇上的JSON解析,有一次把自己文盲了。因为本盲一直使用的是XML(真的是发现了XML的难处了,之后会进一步学习JSON的!),所以后来决定使用自己在前端使用数组组装弹幕信息。

      var  barrage ={  
              img:'static/heisenberg.png', //图片  用户可以自己更改。
                info:'弹幕文字信息', //文字 
                close:true, //显示关闭按钮 
                speed:6, //延迟,单位秒,默认6 
                bottom:70, //距离底部高度,单位px,默认随机 
                color:'#fff', //颜色,默认白色 
                old_ie_color:'#000000', //ie低版兼容色,不能与网页背景相同,默认黑色 
               }

    弹幕终于出来了,可是,出现了弹幕之间的碰撞问题。
    后来参考了 http://qiutianaimeili.com/html/page/2017/09/aa31smab4oi.html 这位大大的 “跑道”思路,对代码进行修改,从而解决了弹幕碰撞的问题。

            function show_barrager(xml) {
                var cont= "";  //弹幕内容
                var imgurl = "";   //弹幕头像
    
                var bm = "";
    
                //每条弹幕发送间隔
                var looper_time = "";
    
               //这个是我自己加的,源码没有这个部分。可能是强迫症,觉得应该有一个变量就要声明一下。
                var lopper = ""; 
                
                //弹幕总数
                var total =num;
                //是否首次执行
                var run_once = true;
                //弹幕索引
                var index = 0;
                var items = new Array(num);
    
    
            //获取了固定弹幕展示的区域。所以对控件中的JS进行了同样的修改,原本的js是获取整个浏览器的高度。
            //首先将弹幕距离底部的高度修改,然后使用循环递归实现弹幕距离底部的高度改变。也是就将其安排在不同的跑道上
                var bottom = $("#div_danmu").height();
    
    
             //解析后台传来的XML
                $(xml).find("info").each(function (i) {
                
                    cont= $(this).children("cont").text();
                    imgurl= $(this).children("imgurl").text();
                    
                    if (imgurl == "") {
                        imgurl = "static/img/heisenberg.png";
                    }
    
                    if (bottom < 60) {  //设置小于60px是因为弹幕js的弹幕框高度是40px,为了保证弹幕之间有间隔,所以设置了60
                        bottom = $("#div_danmu").height() - 60; 
                    } else {
                        bottom = bottom - 60;
                    }
    
                    items[i] = { 'img': imgurl, 'info': cont,'bottom':bottom }
    
                })
    
    
                //每条弹幕发送间隔
                looper_time = 1.2 * 1000;
    
    
                //先执行一次
                barrager();
                function barrager() {
                    if (run_once) {
                        //如果是首次执行,则设置一个定时器,并且把首次执行置为false
                        looper = setInterval(barrager, looper_time);
                        run_once = false;
                    }
                    //发布一个弹幕
                    if (items[index]!=null) {
                        $('#div_danmu').barrager(items[index]);
                        //索引自增
                        index++;
                    }
    
                    //所有弹幕发布完毕,清除计时器。
                    if (index == total-1) {
                        clearInterval(looper);
                        return false;
                    }
                }
            }

    弹幕插件jquery.barrager.js,可以实现基本的功能,但是,其还有许多可以优化的地方。比如:是弹幕不碰撞,将弹幕区域分为多条跑道,同一条跑道中两条相邻弹幕出现的延时等,都是可以得到优化的地方。
    不知道是不是因为该插件是用于浏览器端的,在手机上使用时,有些字数过长的内容,内容上无法显示,这个是还需要我下去解读的。

    最后由衷感谢该弹幕插件开发与给出“跑道”思想的大大。

  • 相关阅读:
    AT2172 Shik and Travel
    bzoj5138 [Usaco2017 Dec]Push a Box
    bzoj3545 [ONTAK2010]Peaks、bzoj3551 [ONTAK2010]Peaks加强版
    bzoj5183 [Baltic2016]Park
    bzoj4423 [AMPPZ2013]Bytehattan
    bzoj2125 最短路
    斐波那契数列小结
    记一场模拟赛
    洛谷2387 BZOJ3669魔法森林题解
    COGS-2638 区间与,异或,询问max
  • 原文地址:https://www.cnblogs.com/smedas/p/12673729.html
Copyright © 2020-2023  润新知