Skip to content

Commit cbafca8

Browse files
committed
Added some support for 2d & 3d transformations. Fixed startDelay to work. Some things are not working. Many efficiency problems will be fixed soon. Added documentation
1 parent ca5522b commit cbafca8

20 files changed

Lines changed: 628 additions & 258 deletions

File tree

.idea/workspace.xml

Lines changed: 125 additions & 132 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demo/scripting/index.htm

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ <h2 style="color:#fff">CCL Scripting Demo</h2>
103103
$("debug-clear").addEventListener("click", function(){
104104
//bscripter.clear();
105105
});
106+
$("player").style.perspective = $("player").offsetWidth * Math.tan(40 * Math.PI/180) / 2 + "px";
107+
$("player").webkitPerspective = $("player").offsetWidth * Math.tan(40 * Math.PI/180) / 2 + "px";
106108
</script>
107109
</body>
108110
</html>

docs/scripting/Display/DisplayObject.md

Whitespace-only changes.

docs/scripting/Display/Events.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
Events 事件
2+
==================================
3+
在Display引擎里面,所有 DisplayObject 派生的对象都是一个潜在的 EventDispatcher。(注意我们
4+
为了节约代码不真的有EventDispatcher抽象层。)
5+
6+
对于这些事件,Kagerou Engine有三种不同的对应策略,它们对于程序效率的影响都各不相同,所以此文档
7+
将作为参考给开发者们选择不同的Event。简单说,Kagerou Engine有三种不同的事件播放体系。
8+
9+
### 常开放 (Always On)
10+
常开放的事件大多数是AS3中的广播事件和渲染事件。由于沙箱无法通过API咨询外部的渲染状况,渲染事件是
11+
定时进行广播的。这些事件在一个DisplayObject被注册时就会开始进行广播,无论是否有监听器。这些事件
12+
几乎全部都是由沙箱内部的定时器程序诱发的,所以多数一般都属于沙箱内事件(In-Sandbox Events)。
13+
因为是沙箱内的广播,所以没有了传输协议可能带来的速度影响,但是因为是由总线派发的,所以这些事件卡住
14+
有可能导致总线卡住。一般来说监听器都是轻松愉快的渲染。
15+
16+
17+
### 常有效 (Always Available)
18+
常有效的事件大多数是由罕发的UI事件组成的,比如点击事件,播放启动暂停事件,加载完毕事件,窗口大小
19+
变化事件,用户诱发的弹幕发送事件等。这些事件总会由外部传送回沙箱内部,因为其罕发性,所以通过量很低。
20+
这些事件是效率最高的一种。
21+
22+
23+
### 限制事件 (Limited Availability)
24+
限制事件大多数是由无法很便利的传输的事件组成的。比如鼠标位置事件,[根对象的添加事件](Root.md)
25+
弹幕播放器自发的更新事件。这些事件只有在绑定后才会传输,而且往往都是滞后传输来避免发送过多的Worker
26+
通讯而堵塞管道(Unclog the pipes!)。
27+
28+
29+
用户事件(User Events)
30+
----------------------------------
31+
用户事件是由用户操作诱发的事件。大多说情况下这些事件都相对比较罕见而稀疏(因为用户的操作并不频繁),
32+
大多数用户相关的事件都采取常有效的模式。
33+
34+
用户事件包括:键盘事件(KeyUp, KeyDown, KeyPress),点击事件(Click, DblClick),播放器
35+
事件(PlayerStateChange)。
36+
37+
沙箱内事件(In Sandbox Events)
38+
----------------------------------
39+
沙箱内事件是一些不需要沙箱外对象参与就可以实现的事件。其中有两种主要的事件:广播事件(Broadcast
40+
Events)和内部事件(Internal Events)。
41+
42+
广播事件诸如:enterFrame,render等。
43+
内部事件诸如:added(不包括root的),removed等
44+
45+
状态事件(State Events)
46+
----------------------------------
47+
状态事件是一些反映各种状态的事件。这些事件往往是降低频率接收的。
48+
49+
比如:mouseX, mouseY (在不邦定mouse相关操作时无法读取)。

docs/scripting/Runtime/Readme.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
Runtime 运行时
2+
=====================================
3+
运行时(Runtime)是代码空间里面提供的一套底层API,它是用来实现影子实例同步的关键部件,和Host端的
4+
ScriptingContext 相互配合。一般来说,如果希望是用非BSE引擎,保留Runtime依然是一个不错的选择,
5+
因为对象注册和同步机制,还有自沙箱外派发的回调的分配,都在Runtime里实现,也很方便使用。
6+
7+
Runtime不是BiliScriptEngine提供的API接口,但是其作为一个底层协议性质的接口,由于实现了影子实例
8+
所以非常有效。便于开发者调试自己的代码使用,也为未来扩展BSE提供了很多接口(包括权限与认证接口)。
9+
10+
Runtime分为两大主要模块,如下:
11+
12+
影子实例同步空间(Shadow Instance Runtime)
13+
--------------------------------------
14+
影子实例同步空间提供了方便影子实例和原始实例同步的一个基础框架。有关具体信息可以参考如下章节:
15+
16+
- [影子实例(Shadow Instances)](../Instances.md)
17+
- [影子架构(Shadow Instance Implementation Details)](Shadow.md)
18+
19+
定时器(Timers)
20+
--------------------------------------
21+
定时器提供了一套总控定时器,一是用于派发 enterFrame等广播事件,二是可以方便每个其余的库快速便利的
22+
取得一个靠谱的定时器(Timer)。比如Tween库就有效的使用了 `Runtime.Timer` 进行内部控制。有关具体
23+
API可以参考:
24+
25+
- [定时器(Timers)](Timers.md)

docs/scripting/Runtime/Shadows.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
Shadow Instance Implementation 影子实例系统的实现细节
2+
=====================
3+
有关影子实例系统的基本设计可以参考 [影子实例(Shadow Instance)](../Instances.md) 章节。
4+
接下来的章节将会默认你知道影子实例的基本状况,进而对如何实现的进行讲解。
5+
6+
对象库(Object Store)
7+
------------------------
8+
为了实现对象的同步,我们需要有一个机构(Module)对这些对象(Object)进行管理。这个机构就叫做
9+
对象库。在沙箱内(Worker端)和沙箱外(Host端)都需要有一个对象库,而且这两个库需要时刻保持同步,
10+
这才能保障有效的影子实例实现。
11+
12+
### 唯一的ID(Unique ID)
13+
由于我们需要区分不同的Object,一个便利的方法是通过给对象颁发“身份证”(Unique Identification)
14+
而这个办法ID的机构就是对象库。
15+
16+
对象库会根据:对象类型,生成时间,库序列和随机数生成一个唯一的ID,如果这个ID与库内其余对象没有冲突,
17+
那么ID就会输出。 由于Object一旦注册,库序列就会发生变化,ID就不会产生冲撞。每一毫秒可以产出4096
18+
个非注册ID和无限多个注册ID。生成时间是为了调试便利和增加唯一性。
19+
20+
具体算法请参考 `Runtime.generateId()`
21+
22+
### 对应关系(Mapping)
23+
有了ID就需要一个可以入库管理关系的机制。在本质上,对象库就是一个大哈希表(Hash Map)对应ID于对象
24+
以方便迅速查找和派发event。
25+
26+
Runtime定义了基础的可以被管理的对象,必须提供以下三个接口:
27+
28+
- `getId()` : 返回该对象的唯一ID
29+
- `serialize()` : 返回一个可以表示这个对象的对象,不得超过JSON允许的种类子集。
30+
- `dispatchEvent(event)` : 接口用于派发Event。
31+
32+
提供了如下接口的Object就都可以注册入对象库,前提是它们的ID不与前者冲撞。由于生成ID的方式,我们可以
33+
保证新的ID不会与库中既在的ID冲突,所以只要使用`generateId()`即可保障这个约束条件。
34+
同时,同一个Object不能注册两次,也就是说同一个ID只能注册一次。
35+
36+
### 特殊对象/元对象(Meta Object)
37+
特殊对象包括播放器,舞台对象等。它们不是由ID派发而出的,因为它们总存在,所以由手写的ID产生。在
38+
Kagerou Engine里面,分别使用了`__player` `__root``__self`
39+
40+
在Runtime里面,我们的定义是,对于任何ID开头是两个下划线的,视其为特殊对象。这些特殊对象在
41+
clear() 和 reset() 时不会被去掉,依然存在于对象库中。所以非常适合表示一些超脱于正常对象的常在
42+
的对应关系。
43+
44+
事件派发(Event Dispatching)
45+
-----------------------------------
46+
对于特殊对象,也有特殊的派发方式,我们暂且不讨论。
47+
48+
对于普通的对象,Runtime会打开一个新的信道,监听有关此Object的信息。在信道上传输的信息则会被派发到
49+
Object上。这个信道用于派发监听器,同时也用于接受消息,如外部摧毁Object的消息。
50+

docs/scripting/Runtime/Timers.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Timers 定时器
2+
=============================
3+
Runtime的另一项重要功能就是控制定时器。在Runtime下有两种定时器:
4+
5+
定时器运行时(TimerRuntime)
6+
------------------------------
7+
定时器运行时是一个可以派发定时器的定时器。在它上面可以绑定一系列更小的定时器,包括两种常见定时器:
8+
timeout(延时)和interval(重复)。
9+
10+
在Runtime里面有一个TimerRuntime的实例,它管控了整个系统的定时器,如 `Utils.timeout`。这些
11+
小型定时器注册到了大的TimerRuntime上。如果暂停了TimerRuntime,那么所有挂载的定时器就暂停了。
12+
13+
定时器(Timer)
14+
------------------------------
15+
独立定时器是运行于定时器运行时以外的定时器。它主要操作了Tween库,也有负责派发 enterFrame 等事件
16+
的实例。Timer们自己包括了定时器对象,提供暂停和event。注意:根据配置,`Utils.interval`也可能会
17+
返回一个Timer实例。在这情况下,对TimerRuntime进行暂停则不会影响 `Utils.interval`
18+
19+
这个设计思维取自 biliscript-syndicate 对 interval 表现的叙述的还原。

docs/scripting/Tween/Readme.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,23 @@ Tween Libraries Set 补间动画支持库
33
Tween Libraries Set是一套尽可能还原支持B站原有补间动画的补间动画库集合。它可以由Tween库进行
44
访问。
55

6-
目前支持尚不完整。
6+
目前支持尚不完整,支持如下的补间:
7+
8+
- tween 普通补间
9+
- to 无起点补间
10+
- scale 缩放补间
11+
- delay 延时启动
12+
- reverse 反播补间
13+
- repeat 多次播放补间
14+
- slice 播放补间的一部分
15+
- serial 串联补间动画
16+
- parallel 并联补间动画
17+
18+
目前不支持:
19+
20+
- beizer 曲线补间
21+
22+
23+
补间函数(Easing)
24+
------------------------------
25+
说到补间,就必须有补间函数咯。

0 commit comments

Comments
 (0)