分享
首页 资讯 产品知识 查看内容

ThingJS官方示例教程(三)

发表于 2020-7-10 15:18
zzv_icon1236 zzr_icon0
摘要: 上一节我们学习了在ThingJS使用app.level.change(ev.campus);这个来注册进出层级事件,该事件可以实现楼层的进出,有自定义属性或是ID属性物体的双击聚焦功能,本节则是详细讲解一下ThingJS中关于层级切换的一些注册 ...

上一节我们学习了在ThingJS使用app.level.change(ev.campus);这个来注册进出层级事件,该事件可以实现楼层的进出,有自定义属性或是ID属性物体的双击聚焦功能,本节则是详细讲解一下ThingJS中关于层级切换的一些注册事件以及如何去控制层级切换!

ThingJS层级切换启用与暂停

在ThingJS中,注册进出层级事件是很简单的,如下方代码所示,但是我们又该如何在层级发生变化的时候去添加对应的逻辑代码呢?其实也不难,使用ThingJS中的层级监听事件THING.EventType.EnterLevel以及THING.EventType.LeaveLevel即可在进出层级的时候去写我们的控制代码了!

app.on('load', function (ev) {
    // 场景加载完成后 进入园区层级
    app.level.change(ev.campus);
});

完整的进出层级监听事件如下:


/**
 * 说明:以建筑(Building)层级为例,说明进出层级事件 及其 方向性
 * 操作:
 * 左键双击建筑 进入建筑层级;此时触发了进入建筑事件
 * 进入建筑后再左键双击 进入楼层;此时触发了退出建筑事件
 * 进入楼层后右键单击 返回建筑;此时触发了进入建筑事件
 * 返回建筑后 右键单击 返回园区;此时触发了退出建筑事件
 * 教程:ThingJS教程——>园区与层级——>【进阶】场景层级事件
 * 难度:★★★☆☆
 */
var app = new THING.App({
    url: 'https://www.thingjs.com/static/models/storehouse'     // 场景地址
});

app.on('load', function (ev) {
    // 场景加载完成后 进入园区层级
    app.level.change(ev.campus);
});

// 监听建筑层级的 EnterLevel 事件
app.on(THING.EventType.EnterLevel, ".Building", function (ev) {
    // 当前进入的层级对象
    var current = ev.current;
    // 上一层级对象
    var preObject = ev.previous;

    // 如果当前层级对象的父亲是上一层级对象(即正向进入)
    if (current.parent === preObject) {
        console.log("从 " + preObject.type + " 进入了 " + current.type);
    }
    else {
        console.log("进入 " + current.type + "(从 " + preObject.type + " 退出)");
    }
});

// 监听建筑层级的 LeaveLevel 事件
app.on(THING.EventType.LeaveLevel, ".Building", function (ev) {
    // 要进入的层级对象
    var current = ev.current;
    // 上一层级对象(退出的层级)
    var preObject = ev.previous;

    if (current.parent === preObject) {
        console.log("退出 " + preObject.type + " 进入 " + current.type);
    }
    else {
        console.log("退出 " + preObject.type + " ,返回 " + current.type);
    }
})

这个只是一个基础版本的进出层级监控输出,如果是需要在进出层级的时候添加事件,则需要在我们的EnterLevel事件、LeaveLevel 事件中添加对应的功能事件代码,比如后续的添加物体2D顶牌或者3D Marker标记,我们也会在后续进行讲解。

同样,针对进出园区层级控制,我们也有重新注册园区事件以及暂停园区事件的功能,相关代码如下:


/**
 * 说明:以建筑(Building)层级为例,说明进出层级事件 及其 方向性
 * 操作:
 * 左键双击建筑 进入建筑层级;此时触发了进入建筑事件
 * 进入建筑后再左键双击 进入楼层;此时触发了退出建筑事件
 * 进入楼层后右键单击 返回建筑;此时触发了进入建筑事件
 * 返回建筑后 右键单击 返回园区;此时触发了退出建筑事件
 * 教程:ThingJS教程——>园区与层级——>【进阶】场景层级事件
 * 难度:★★★☆☆
 */
var app = new THING.App({
    url: 'https://www.thingjs.com/static/models/storehouse'     // 场景地址
});

app.on('load', function (ev) {
    new THING.widget.Button('开', queryByOpen);
    new THING.widget.Button('关', queryByClose);
    // 场景加载完成后 进入园区层级
    app.level.change(ev.campus);

});

function queryByOpen() {
    // 开启系统内置的左键双击进入下一层级操作
    app.resumeEvent(THING.EventType.DBLClick, '*', THING.EventTag.LevelEnterOperation);
    // 开启系统内置的右键单击返回上一层级操作
    app.resumeEvent(THING.EventType.Click, null, THING.EventTag.LevelBackOperation);
    // 开启进入物体层级默认操作行为
    app.resumeEvent(THING.EventType.LeaveLevel, '.Thing', THING.EventTag.LevelSceneOperations);
    // 开启退出物体层级默认操作行为
    app.resumeEvent(THING.EventType.EnterLevel, '.Thing', THING.EventTag.LevelSceneOperations);
}

function queryByClose() {
    // 暂停系统内置的左键双击进入下一层级操作
    app.pauseEvent(THING.EventType.DBLClick, '*', THING.EventTag.LevelEnterOperation);
    // 暂停系统内置的右键单击返回上一层级操作
    app.pauseEvent(THING.EventType.Click, null, THING.EventTag.LevelBackOperation);
    // 暂停进入物体层级默认操作行为
    app.pauseEvent(THING.EventType.EnterLevel, '.Thing', THING.EventTag.LevelSceneOperations);
    // 暂停退出物体层级默认操作行为
    app.pauseEvent(THING.EventType.LeaveLevel, '.Thing', THING.EventTag.LevelSceneOperations);
}