上一節咱們學習了在ThingJS使用app.level.change(ev.campus);這個來註冊進出層級事件,該事件能夠實現樓層的進出,有自定義屬性或是ID屬性物體的雙擊聚焦功能,本節則是詳細講解一下ThingJS中關於層級切換的一些註冊事件以及如何去控制層級切換!app
在ThingJS中,註冊進出層級事件是很簡單的,以下方代碼所示,可是咱們又該如何在層級發生變化的時候去添加對應的邏輯代碼呢?其實也不難,使用ThingJS中的層級監聽事件THING.EventType.EnterLevel以及THING.EventType.LeaveLevel便可在進出層級的時候去寫咱們的控制代碼了!學習
app.on('load', function (ev) { // 場景加載完成後 進入園區層級 app.level.change(ev.campus); });
完整的進出層級監聽事件以下:ui
/** * 說明:以建築(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標記,咱們也會在後續進行講解。url
一樣,針對進出園區層級控制,咱們也有從新註冊園區事件以及暫停園區事件的功能,相關代碼以下:spa
/** * 說明:以建築(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); }