Skip to content

Commit a956a6f

Browse files
committed
添加调试用项目
1 parent 292b2f0 commit a956a6f

File tree

7 files changed

+539
-0
lines changed

7 files changed

+539
-0
lines changed

debug/contextmenu.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
window.contextmenu = function (bindElement, contextmenuElement) {
2+
let _getContextmenuState = function () {
3+
return contextmenuElement.style.display != 'none';
4+
}
5+
/**
6+
* 获取上下文菜单的状态
7+
* @function
8+
* @returns {boolean} 指示上下文菜单是否正处于激活/显示状态。
9+
*/
10+
this.getContextmenuState = _getContextmenuState;
11+
/**
12+
* 关闭上下文菜单:如果当前上下文菜单正处于激活/显示状态则立即关闭。
13+
*/
14+
this.closeContextmenu = () => {
15+
if (_getContextmenuState()) {
16+
contextmenuElement.style.display = 'none';
17+
}
18+
}
19+
20+
contextmenuElement.style.position = 'fixed';
21+
contextmenuElement.style.display = 'none';
22+
contextmenuElement.oncontextmenu = () => false;
23+
24+
let isParent = function(element, parentElement) {
25+
do if (element === parentElement) return true;
26+
while(document != (element = element.parentNode))
27+
return false;
28+
}
29+
30+
let _closeContextmenu = function (e) {
31+
if (_getContextmenuState() && !isParent(e.target,contextmenuElement)) {
32+
contextmenuElement.style.display = 'none';
33+
if (e.type === 'click') e.stopPropagation();
34+
}
35+
}
36+
37+
window.addEventListener('click', _closeContextmenu, true);
38+
window.addEventListener('contextmenu', _closeContextmenu, true);
39+
window.addEventListener('scroll', _closeContextmenu, true);
40+
41+
42+
bindElement.oncontextmenu = function (e) {
43+
e.stopPropagation();
44+
contextmenuElement.style.display = '';
45+
let top = e.clientY, left = e.clientX;
46+
if (top + contextmenuElement.clientHeight > document.documentElement.clientHeight) top -= contextmenuElement.clientHeight;
47+
if (left + contextmenuElement.clientWidth > document.documentElement.clientWidth) left -= contextmenuElement.clientWidth;
48+
contextmenuElement.style.top = `${top}px`;
49+
contextmenuElement.style.left = `${left}px`;
50+
return false;
51+
}
52+
}

debug/images/background.jpg

282 KB
Loading

debug/openBSEDemo.html

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<!DOCTYPE HTML>
2+
<html>
3+
4+
<head>
5+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
6+
<title>openBSE Demo</title>
7+
<link href="style.css" rel="stylesheet" type="text/css">
8+
<script src="../dist/openBSE.all.js"></script>
9+
<script src="stats.js"></script>
10+
<script src="contextmenu.js"></script>
11+
<script src="openBSEDemo.js"></script>
12+
</head>
13+
14+
<body>
15+
<p style="font-size: 70%">引擎版本:<b id="version"></b>&nbsp;构建时间:<b id="buildDate"></b></p>
16+
<div class="stage" id="stage">
17+
<div class="stage-el" id="BulletScreensDiv"></div>
18+
<div class="debug-info" id="debug_info" style="display:none;">
19+
<div class="close" id="debug_info_close">[x]</div>
20+
<div class="text">Time: <b id="time"></b>ms</div>
21+
<div class="text">Delay Bullet-Screen Count: <b id="delayBulletScreenCount"></b></div>
22+
<div class="text">Buffer Bullet-Screen Count: <b id="bufferBulletScreenCount"></b></div>
23+
<div class="chart" id="fps"></div>
24+
<div class="chart" id="delay"></div>
25+
<div class="chart" id="realTimeBulletScreenCount"></div>
26+
</div>
27+
</div>
28+
<p><input type="text" style="width:500px;" id="BulletScreenText">&nbsp;<a href="javascript:void(0)"
29+
onclick="sendBulletScreen();">发送</a></p>
30+
<p>
31+
渲染模式:
32+
<form id="renderModes" onclick="setRenderModes();">
33+
<input type="radio" value="canvas" name="renderModes">Canvas&nbsp;
34+
<input type="radio" value="css3" name="renderModes">CSS3&nbsp;
35+
<input type="radio" value="webgl" name="renderModes">WebGL&nbsp;
36+
<input type="radio" value="svg" name="renderModes">SVG&nbsp;
37+
</form>
38+
</p>
39+
<p>
40+
隐藏弹幕:
41+
<form id="hiddenTypes" onclick="sethiddenTypes();">
42+
<input type="checkbox" value="1" name="hiddenTypes">普通&nbsp;
43+
<input type="checkbox" value="2" name="hiddenTypes">逆向&nbsp;
44+
<input type="checkbox" value="4" name="hiddenTypes">顶部&nbsp;
45+
<input type="checkbox" value="8" name="hiddenTypes">底部&nbsp;
46+
</form>
47+
</p>
48+
<p>上次单击的弹幕内容:<b id="clickText"></b></p>
49+
<a href="javascript:void(0)" onclick="generalEngine.play();">开始</a>&nbsp;<a href="javascript:void(0)" onclick="generalEngine.pause();">暂停</a>
50+
&nbsp;<a href="javascript:void(0)"
51+
onclick="generalEngine.stop();">停止</a>&nbsp;
52+
<a href="javascript:void(0)" onclick="generalEngine.visibility = true;">显示弹幕</a>&nbsp;<a href="javascript:void(0)"
53+
onclick="generalEngine.visibility = false;">隐藏弹幕</a>&nbsp;
54+
<a href="javascript:void(0)" onclick="generalEngine.cleanBuffer();loadData(generalEngine);">重新加载弹幕</a>&nbsp;<a href="javascript:void(0)"
55+
onclick="generalEngine.cleanScreen();">清空屏幕</a>&nbsp;<br>
56+
<a href="javascript:void(0)" onclick="set('playSpeed', 1);">1倍速</a>&nbsp;<a href="javascript:void(0)" onclick="set('playSpeed', 1.5);">1.5倍数</a>&nbsp;
57+
<a href="javascript:void(0)" onclick="set('playSpeed', 2);">2倍速</a>&nbsp;<a href="javascript:void(0)" onclick="set('playSpeed', 2.5);">2.5倍数</a>&nbsp;
58+
<a href="javascript:void(0)" onclick="set('scaling', 1);">1倍缩放</a>&nbsp;<a href="javascript:void(0)" onclick="set('scaling', 1.5);">1.5倍缩放</a>&nbsp;
59+
<a href="javascript:void(0)" onclick="set('scaling', 2);">2倍缩放</a>&nbsp;<a href="javascript:void(0)"
60+
onclick="set('scaling', 0.75);">0.75倍缩放</a>&nbsp;<br>
61+
<a href="javascript:void(0)" onclick="set('opacity', 0);">100%透明</a>&nbsp;<a href="javascript:void(0)" onclick="set('opacity', 0.25);">75%透明</a>&nbsp;
62+
<a href="javascript:void(0)" onclick="set('opacity', 0.5);">50%透明</a>&nbsp;<a href="javascript:void(0)"
63+
onclick="set('opacity', 0.75);">25%透明</a>&nbsp;
64+
<a href="javascript:void(0)" onclick="set('opacity', 1);">不透明</a>
65+
<div class="contextmenu" id="bullet_screen_contextmenu" style="display:none;">
66+
<div class="item canselect">举报</div>
67+
<div class="item canselect">举报并屏蔽</div>
68+
<div class="item canselect">复制</div>
69+
</div>
70+
<div class="contextmenu" id="stage_contextmenu" style="display:none;">
71+
<div class="item">openBSE v<b id="contextmenu_item_version"></b></div>
72+
<div class="item canselect" id="contextmenu_item_debug_info">弹幕详细统计信息</div>
73+
</div>
74+
</body>
75+
76+
</html>

debug/openBSEDemo.js

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
window.onload = function () {
2+
window.renderMode = "canvas";
3+
window.fpsStats = new stats("FPS", 55, 65, "#75F8FB", document.getElementById('fps'));
4+
window.delayStats = new stats("Delay", 0, 10, "#7DEE3A", document.getElementById('delay'));
5+
window.realTimeBulletScreenCountStats = new stats("Real Time Bullet-Screen Count", 0, 10, "#EA5798", document.getElementById('realTimeBulletScreenCount'));
6+
7+
var versionInfo = openBSE.getVersion();
8+
document.getElementById("version").innerText = document.getElementById("contextmenu_item_version").innerText = versionInfo.version;
9+
document.getElementById("buildDate").innerText = versionInfo.buildDate;
10+
11+
window.generalEngine = new openBSE.GeneralEngine(document.getElementById('BulletScreensDiv'), {
12+
defaultStyle: {
13+
fontFamily: '"Microsoft YaHei","PingFang SC",SimHei,"Heiti SC",sans-serif',
14+
borderColor: 'rgba(0,0,0,0.4)',
15+
fontWeight: 'normal',
16+
shadowBlur: 4
17+
}
18+
}, getRenderMode());
19+
20+
setRenderModeRadioDefault();
21+
22+
var bulletScreenContextmenu = new openBSE.Contextmenu(generalEngine, document.getElementById('bullet_screen_contextmenu'));
23+
var stageContextmenu = new contextmenu(document.getElementById('stage'), document.getElementById('stage_contextmenu'));
24+
25+
generalEngine.bind('click', function (e) {
26+
document.getElementById("clickText").innerText = e.getBulletScreen().text;
27+
e.setBulletScreen({
28+
style: { color: 'red' },
29+
layer: 2
30+
}, true);
31+
});
32+
33+
34+
35+
document.getElementById('contextmenu_item_debug_info').onclick = function(e) {
36+
stageContextmenu.closeContextmenu();
37+
var debugInfo = document.getElementById('debug_info');
38+
if (debugInfo.style.display != 'none') return;
39+
debugInfo.style.display = '';
40+
fpsStats.reSize();fpsStats.clean();
41+
delayStats.reSize();delayStats.clean();
42+
realTimeBulletScreenCountStats.reSize();realTimeBulletScreenCountStats.clean();
43+
setTimeout(showDebugInfo, 0);
44+
}
45+
document.getElementById('debug_info_close').onclick = function(e) {
46+
document.getElementById('debug_info').style.display = 'none';
47+
}
48+
49+
loadData();
50+
}
51+
52+
function loadData() {
53+
var _startTime = 1000;
54+
for (var i = 0; i < 10000; i++) {
55+
if (Math.random() > 0.6)
56+
generalEngine.add({
57+
text: "这是一个长长长长长长长长长长长长长长长长长长长长长长长长的测试(^_^)",
58+
startTime: _startTime,
59+
type: openBSE.GeneralType.rightToLeft,
60+
style: {
61+
speed: 0.15 + Math.random() / 90,
62+
size: 23,
63+
color: 'white'
64+
}
65+
});
66+
else
67+
generalEngine.add({
68+
text: "橘里橘气",
69+
startTime: _startTime,
70+
type: (Math.random() > 0.4) ? openBSE.GeneralType.rightToLeft : openBSE.GeneralType.top,
71+
style: {
72+
speed: 0.1 + Math.random() / 90,
73+
color: '#FFCC66'
74+
}
75+
});
76+
_startTime += Math.round(Math.random() * 500);
77+
}
78+
}
79+
80+
function showDebugInfo() {
81+
var debugInfo = generalEngine.debugInfo;
82+
document.getElementById("time").innerText = debugInfo.time.toFixed(2);
83+
document.getElementById("bufferBulletScreenCount").innerText = debugInfo.bufferBulletScreenCount;
84+
document.getElementById("delayBulletScreenCount").innerText = debugInfo.delayBulletScreenCount;
85+
delayStats.update(debugInfo.delay, debugInfo.delay.toFixed(2) + 'ms');
86+
fpsStats.update(debugInfo.fps, debugInfo.fps);
87+
realTimeBulletScreenCountStats.update(debugInfo.realTimeBulletScreenCount, debugInfo.realTimeBulletScreenCount);
88+
if (document.getElementById('debug_info').style.display != 'none') setTimeout(showDebugInfo, 100);
89+
}
90+
91+
function sendBulletScreen() {
92+
var bulletScreenText = document.getElementById("BulletScreenText").value;
93+
document.getElementById("BulletScreenText").value = '';
94+
generalEngine.add({
95+
text: bulletScreenText,
96+
style: {
97+
boxColor: 'white'
98+
},
99+
layer: 1,
100+
canDiscard: false
101+
});
102+
}
103+
104+
function sethiddenTypes() {
105+
var formData = new FormData(document.getElementById("hiddenTypes"));
106+
var hiddenTypesList = formData.getAll('hiddenTypes');
107+
var hiddenTypes = 0;
108+
for (var index in hiddenTypesList) hiddenTypes += parseInt(hiddenTypesList[index]);
109+
generalEngine.options = {
110+
hiddenTypes: hiddenTypes
111+
};
112+
}
113+
114+
function getRenderMode() {
115+
switch (location.hash) {
116+
case "#css3":
117+
return "css3";
118+
case "#webgl":
119+
return "webgl";
120+
case "#svg":
121+
return "svg";
122+
default:
123+
return "canvas";
124+
}
125+
}
126+
127+
function setRenderModeRadioDefault() {
128+
var renderMode = getRenderMode();
129+
var radios = document.getElementById("renderModes");
130+
for (var index = 0;index < radios.length; index++)
131+
{
132+
if(radios[index].value == renderMode)
133+
radios[index].checked = "checked";
134+
}
135+
}
136+
137+
function setRenderModes() {
138+
var formData = new FormData(document.getElementById("renderModes"));
139+
location.replace("#" + formData.get('renderModes'));
140+
location.reload();
141+
}
142+
143+
function set(key, value) {
144+
var object = {};
145+
object[key] = value;
146+
generalEngine.options = object;
147+
}

debug/openBSESpecialDemo.html

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
<!DOCTYPE HTML>
2+
<html>
3+
4+
<head>
5+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
6+
<title>弹幕引擎Demo</title>
7+
<script src="//openbse.netlify.app/openbse.all.min.js"></script>
8+
<script>
9+
window.onload = function () {
10+
var versionInfo = openBSE.getVersion();
11+
document.getElementById("version").innerText = versionInfo.version;
12+
document.getElementById("buildDate").innerText = versionInfo.buildDate;
13+
window.specialEngine = new openBSE.SpecialEngine(document.getElementById('BulletScreensDiv'), {}, 'canvas');
14+
15+
loadData(specialEngine);
16+
setInterval(showDebugInfo, 500);
17+
}
18+
var loadData = function (specialEngine) {
19+
specialEngine.add({
20+
text: '测试测试测试测试',
21+
startTime: 1000,
22+
endTime: 100000000,
23+
renderCode: 'setStyle({transform: "translate(100px,100px)rotate(" + Math.floor(time / 10) % 360 + "deg)"});'
24+
});
25+
specialEngine.add({
26+
text: '测试测试测试测试测试测试',
27+
startTime: 1000,
28+
endTime: 100000000,
29+
renderCode: 'setStyle({transform: "translate(200px,200px)rotate(" + (360 - Math.floor(time / 10) % 360) + "deg)"});'
30+
});
31+
specialEngine.add({
32+
text: '测试测试测试测',
33+
startTime: 1000,
34+
endTime: 100000000,
35+
renderCode: 'setStyle({transform: "translate(300px,300px)rotate(" + (360 - Math.floor(time) % 360) + "deg)"});'
36+
});
37+
specialEngine.add({
38+
text: '测试',
39+
startTime: 1000,
40+
endTime: 100000000,
41+
renderCode: 'setStyle({text:"测试" + Math.floor(time / 500) % 500, transform: "translate(" + Math.floor(time / 10) % 500 + "px," + (500 - Math.floor(time / 100) % 500) + "px)"});'
42+
});
43+
specialEngine.add({
44+
text: '测试',
45+
startTime: 1000,
46+
endTime: 100000000,
47+
renderCode: 'setStyle({text:"测试" + Math.floor(time / 500) % 500, transform: "translate(" + (500 - Math.floor(time / 10) % 500) + "px," + Math.floor(time / 100) % 500 + "px)"});'
48+
});
49+
specialEngine.add({
50+
text: 'AAAAAAAAAAAAAAAAAAAAAAAAAA',
51+
startTime: 1000,
52+
endTime: 100000000,
53+
renderCode: 'setStyle({text: Math.floor(time / 1000) % 2 == 1 ? "AAAAAAAAAAAAAAAAAAAAAAAAAA" : "", transform: "translate(350px, 450px)"});'
54+
});
55+
}
56+
var showDebugInfo = function () {
57+
var debugInfo = specialEngine.debugInfo;
58+
document.getElementById("time").innerText = debugInfo.time.toString();
59+
document.getElementById("delay").innerText = debugInfo.delay.toString();
60+
document.getElementById("fps").innerText = debugInfo.fps.toString();
61+
document.getElementById("BulletScreensOnScreenCount").innerText = debugInfo.realTimeBulletScreenCount.toString();
62+
document.getElementById("BulletScreensCount").innerText = debugInfo.bufferBulletScreenCount.toString();
63+
document.getElementById("delayBulletScreensCount").innerText = debugInfo.delayBulletScreenCount.toString();
64+
}
65+
function set(key, value) {
66+
var object = {};
67+
object[key] = value;
68+
specialEngine.options = object;
69+
}
70+
</script>
71+
</head>
72+
73+
<body>
74+
<p style="font-size: 70%">引擎版本:<b id="version"></b>&nbsp;构建时间:<b id="buildDate"></b></p>
75+
<div style="width:936px;height:526.5px;position:relative;">
76+
<div style="left:0;top:0;right:0;bottom:0;position:absolute;background:url(./images/background.jpg);background-size: 100%;"></div>
77+
<div id="BulletScreensDiv" style="left:0;top:0;right:0;bottom:0;position:absolute;"></div>
78+
</div>
79+
<p>时间:<b id="time"></b> fps:<b id="fps"></b></p>
80+
<p>实时弹幕数:<b id="BulletScreensOnScreenCount"></b>&nbsp;缓冲区弹幕数:<b id="BulletScreensCount"></b></p>
81+
<p>延迟:<b id="delay"></b>ms 延迟丢弃丢弃弹幕数:<b id="delayBulletScreensCount"></b></p>
82+
<a href="#" onclick="specialEngine.play();">开始</a>&nbsp;<a href="#" onclick="specialEngine.pause();">暂停</a>&nbsp;<a
83+
href="#" onclick="specialEngine.stop();">停止</a>&nbsp;
84+
<a href="#" onclick="specialEngine.visibility = true;">显示弹幕</a>&nbsp;<a href="#" onclick="specialEngine.visibility = false;">隐藏弹幕</a>&nbsp;
85+
<a href="#" onclick="specialEngine.cleanBuffer();loadData(generalEngine);">重新加载弹幕</a>&nbsp;<a
86+
href="#" onclick="specialEngine.cleanScreen();">清空屏幕</a>&nbsp;<br>
87+
<a href="#" onclick="set('playSpeed', 1);">1倍速</a>&nbsp;<a href="#" onclick="set('playSpeed', 1.5);">1.5倍数</a>&nbsp;
88+
<a href="#" onclick="set('playSpeed', 2);">2倍速</a>&nbsp;<a href="#" onclick="set('playSpeed', 2.5);">2.5倍数</a>&nbsp;
89+
<a href="#" onclick="set('scaling', 1);">1倍缩放</a>&nbsp;<a href="#" onclick="set('scaling', 1.5);">1.5倍缩放</a>&nbsp;
90+
<a href="#" onclick="set('scaling', 2);">2倍缩放</a>&nbsp;<a href="#" onclick="set('scaling', 0.75);">0.75倍缩放</a>&nbsp;<br>
91+
<a href="#" onclick="set('opacity', 0);">100%透明</a>&nbsp;<a href="#" onclick="set('opacity', 0.25);">75%透明</a>&nbsp;
92+
<a href="#" onclick="set('opacity', 0.5);">50%透明</a>&nbsp;<a href="#" onclick="set('opacity', 0.75);">25%透明</a>&nbsp;
93+
<a href="#" onclick="set('opacity', 1);">不透明</a>
94+
<div id="contextmenu" style="padding:3px;width:120px;height:19px;position:fixed;border:1px solid black;background:rgba(255, 255, 255, 0.9);font-size: 13px;display:none;cursor: default;">上下文菜单</div>
95+
</body>
96+
97+
</html>

0 commit comments

Comments
 (0)