Nebula3中的Entity

來源:互聯網
上載者:User

N3架構上是分了三層的, foundation, render, application.

一直以來看的都是foundation和render, 上層的一直沒怎麼看

今天大體上瀏覽了下, 感覺東西還是滿多的

很多引擎都沒這一層的, 如果沒有實際項目的積累, 也沒法抽象出複用的部分來

這裡說的Entity不是GraphicsEntity, 而是Game::Entity, 代表遊戲中的一個對象, 比如人, 道具什麼的

一個Entity由以下幾部分組成:

  • ID : 這個沒啥好說的
  • AttributeTable: 屬性工作表, 跟資料庫綁定, 資料驅動的前提
  • Properties: 或許叫Component更合適, 組件模型, 現在大家都這麼幹了, 除了國內的人-_-

跟其他組件模型有點不一樣的是, 如果想調用Entity中某個組件的功能, 直接發個訊息給這個Entity就可以. 它自己找到處理這個訊息的Property進行處理. 從這一點來說, Entity也是一個訊息分配器(Dispatcher):

+------+<br /> +-->| Port |<br /> / +------+<br /> +------------+/ +------+<br /> --- Msg --->| Dispatcher |----->| Port |<br /> +------------+/ +------+<br /> / +------+<br /> +-->| Port |<br /> +------+<br />

實際上Property是從Messaging::Port繼承的, 然後Port再把訊息交給Handler去處理. 這樣一來, 擴充功能只需要增加Message和對應的Handler就可以了.

想想N3中其實很多地方都用了訊息, 比如多線程. 雖然這種方式解決了同步之類的煩惱, 但是也造就了Message滿天飛的現象, 以至於他們寫了個idlc來自動產生Message標頭檔...

在看WPF執行緒模式的時候, 突然想到, 是不是可以參考它的跨線程調用方法(Dispatcher.BeginInvoke)呢? 其實就是把調用函數變成一個delegate, 再加上參數, 一起裝在一起排入佇列. 本質上還是訊息的形式, 只不過不用定義訊息結構和寫處理分支了. 壞處就是, 把調用細節暴露出來, 耦合度太大......

嗯, 跑題了

 

那個Property派生出來GraphicsProperty, TransformableProperty, CameraProperty, InputProperty, StateProperty等等. 想要顯示在情境裡就用GraphicsProperty, 想響應輸入就加一個InputProperty, 諸如此類. 要調用其它Property的方法也不用從Entity中找到再cast什麼的, 直接一個訊息扔進去就完了...

 

另外屬性工作表的應用和實現都比較複雜, 下回分解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.