阅读 《场景管理》 了解场景的概念。本章只做场景相关的 API 讲解。
通过调用 displayer.entireScenes()
可以获取房间内全部场景、场景组的信息。它会返回一个字典结构的 object
,其 Key 是场景组的地址,Value 是一个数组,表明该场景组下所有场景的信息。举个例子,某个房间在调用该方法后,可能返回如下内容。
{
"/math": [
{name: "lesson-1"},
{name: "lesson-2"},
],
"/biology": [
{name: "lesson-1"},
{name: "lesson-2"},
{name: "lesson-3"},
],
"/biology/__tmp": [
{name: "temp"},
],
}
从如上内容,我们可以提炼出关于该房间的如下信息:
该房间内有三个场景组 /math
、/biology
、/biology/__tmp
。其中 /math
下包含两个场景,分别是 /math/lesson-1
、/math/lesson-2
。而 /biology
下包含三个场景(不再列举)和一个子场景组 /biology/__tmp
。该子场景组还包含一个场景 /biology/__tmp/temp
。
此外,我们还可以根据 displayer.scenePathType
方法来读取某个地址,以判断该地址的类型。具体代码如下。
// 打印 "dir" 表示场景组
console.log(displayer.scenePathType("/biology/__tmp"));
// 打印 "page" 表示场景
console.log(displayer.scenePathType("/math/lesson-1"));
// 打印 "none" 表示该地址不存在
console.log(displayer.scenePathType("/math/__tmp"));
putScenes(path: string, scenes: ReadonlyArray<SceneDefinition>, index?: number): void;
该方法可以将一个或多个场景插入到指定路径下。例如,如下代码可以插入一个场景到房间内,其路径为 /math/lesson
。
room.putScenes("/math", [{name: "lesson"}]);
也可以通过如下方法插入多个场景,且令这些场景的路径为:/math/lesson-1
、/math/lesson-2
、/math/lesson-3
。
room.putScenes("/math", [
{name: "lesson-1"},
{name: "lesson-2"},
{name: "lesson-3"},
]);
也可以在插入场景时,顺便初始化背景 PPT 的内容。
room.putScenes("/math", [
{name: "lesson-1", ppt: {width: 720, height: 640, src: "http://my-domain/ppt-1.png"}},
{name: "lesson-2", ppt: {width: 720, height: 640, src: "http://my-domain/ppt-2.png"}},
{name: "lesson-3", ppt: {width: 720, height: 640, src: "http://my-domain/ppt-3.png"}},
]);
在调用 room.putScenes
,我们可以通过指定第三参数 index
来要求把场景插入到场景组的指定索引的位置。
例如,假定场景组 /biology/
之中有多个场景,因此,当我们调用 room.entireScenes()
时,会返回如下内容。
{
"/biology": [
{name: "lesson-1"},
{name: "lesson-2"},
{name: "lesson-3"},
{name: "lesson-4"},
{name: "lesson-5"},
],
}
此时我们执行如下代码。
room.putScenes("/biology", [{name: "foo"}, {name: "bar"}], 3);
再次调用 room.entireScenes()
时,会返回如下内容。
{
"/biology": [
{name: "lesson-1"},
{name: "lesson-2"},
{name: "lesson-3"},
{name: "foo"},
{name: "bar"},
{name: "lesson-4"},
{name: "lesson-5"},
],
}
removeScenes(path: string): void;
该方法可以删除指定地址对应的场景。例如如下代码会删除地址为 /math/lesson-1
的场景。
room.removeScenes("/math/lesson-1");
如果地址对应的是场景组,不只会删除场景组,还会删除该场景组直接或间接包含的所有场景和场景组。
room.removeScenes("/math");
你也可以通过如下代码,删除房间内的所有场景。
room.removeScenes("/");
这会删除所有场景,并立即创建一个 /init
的空场景并切换到该场景。
moveScene(originalPath: string, targetPath: string): void;
该方法可以将地址 originalPath
对应的场景移动到 targetPath
地址。该方法不能移动场景组。
同一时间,同一房间只能处于特定场景。我们可以通过如下代码获取当前场景的地址。
displayer.state.sceneState.scenePath;
我们也可以通过如下方法切换当前场景。
// 切换到地址为 /math/lesson-1 的场景
room.setScenePath("/math/lesson-1");
当房间处于某个场景时,该场景所属的场景组称之为「上下文场景组」。我们可以通过如下代码获取上下文场景组中的所有场景信息。
displayer.state.sceneState.scenes;
该代码的返回值可能长成这样。
[
{name: "lesson-1"},
{name: "lesson-2"},
{name: "lesson-3"},
]
通过如下代码,我们可以知道当前场景在上下文场景组中的索引位置。
displayer.state.sceneState.index;
知道当前场景的索引,我们可以通过如下代码作出类似「切到下一页」的功能。
var nextIndex = room.state.sceneState.index + 1;
var scenes = room.state.sceneState.scenes;
if (nextIndex < scenes.length) {
room.setSceneIndex(nextIndex);
}