我在这里把弹幕播放器里的寻轨函数贴出来
首先用四个数组代表四种弹幕的轨道,轨道高度就是屏幕高度
然后生成弹幕时用寻轨函数找到能容得下这个弹幕的空轨道
轨道数组:(原谅我放荡不羁地用拼音英语混合命名。。。)
danmutunnel = {
right: [],
left: [],
bottom: [],
top: []
}
实际上每个轨道的数组只是分页数组,轨道在每一个里面
tunnel[tun][ind]
↑ ↑
页码 轨道号
寻轨函数:
getTunnel: function(type, size) {//传入弹幕类型,尺寸
var tunnel;//定义当前操作哪一类轨道
switch (type) {
case 0:
{
tunnel = danmutunnel.right;
break;
}
case 1:
{
tunnel = danmutunnel.left;
break;
}
case 2:
{
tunnel = danmutunnel.bottom;
break;
}
case 3:
{
tunnel = danmutunnel.top;
break;
}
}
var tun = 0,
ind = i = 1;//从轨道的第0页位置1开始寻找空位
if (!tunnel[tun]) tunnel[tun] = [];//如果这一页不存在就创建出来(就是一个数组)。
//从位置1开始往下遍历,如果在起始位置和末位置之间没有轨道被其它弹幕标记的话就在起始位置做一个标记。
//如果途中碰到了其他弹幕做的标记,就按这个地方标记的尺寸跳到它后面去,然后接着遍历
//遍历到容不下这个弹幕的时候就把页数+1跳到下一页(回到顶端),重新从这一页的位置1开始遍历
while (ind < (i + size)) {
if (tunnel[tun][ind]) {//如果这个地方已经做了标记
i = ind + tunnel[tun][ind];//把当前标记的位置加上这里记录的尺寸
ind = i; //把试探变量也带到这里来
if (ind > (tunnelheight - size)) {//如果已经容不下这个弹幕
tun++;//到后面一页
i = ind = 1;//弹幕位置和试探变量回到1
if (!tunnel[tun]) tunnel[tun] = [];//如果这一页不存在就创建
}
} else if (ind == (i + size - 1)) {//如果试探变量已经到达了起始位置+尺寸-1的位置(找到了容得下的空间)
break;
} else {//啥也没有的情况
ind++;//试探变量继续往下找
};
}//退出循环就代表找到空位了
tunnel[tun][i] = size;//在找到的位置上做上标记
return [type, tun, i]; //返回轨道类号,分页号,轨道号,方便在一定条件下清除轨道上的标记
}
本文发布于 https://luojia.me
本站文章未经文下加注授权不得拷贝发布。
标记一下
干嘛用的这个 楞是没看明白
要用的人才会看明白啊(๑•́ ω •̀๑)路过的肯定不明
要用的人才会看明白啊(๑•́ ω •̀๑)路过的肯定不明
猫视很多免费的也比这个美观很多吧
你指哪部分更美观。。
用易语言吧
啥意思。。
这个都出来了哈。。
因为好像不少人纠结的样子
原来如此,弹幕越来越多人看了。。