基于Vue的微信小游戲框架Gegjs

背景

相信做前端的朋友對(duì)Vuejs的雙向綁定與組件化開發(fā)絕對(duì)印象深刻,筆者也為Vue的諸多特性頗為贊嘆,它為前端的生態(tài)真的注入了太多力量,它的成功除了得益于Vue自身的健壯性之外,基于它的拓展性也滿足了各個(gè)不同項(xiàng)目組特定的定制化的需求年碘,也誕生了類似于針對(duì)微信小程序開發(fā)的mpvue妓羊,基于網(wǎng)頁端開發(fā)的UI架構(gòu)ElementUI等優(yōu)秀項(xiàng)目绊起。有些人可能會(huì)問腔彰,這些鋪墊有什么用處芍阎,還不是想襯托目前還沒有一個(gè)項(xiàng)目可以基于Vuejs開發(fā)微信小游戲的么世曾?是的,所有的鋪墊必然是有目的的谴咸,我覺得有必要介紹下這個(gè)項(xiàng)目誕生的原因轮听。

首先,筆者從畢業(yè)后一直從事的是游戲與3D渲染方面的工作寿冕,對(duì)前端可以說是不同的領(lǐng)域蕊程,直到前兩年接觸了Webgl后,就慢慢的往Web渲染這塊技術(shù)靠攏驼唱,用到Webgl的過程中也必然會(huì)跟前端的主流技術(shù)打交道藻茂,像jquery,jquery,jquery辨赐!有人會(huì)很驚嘆优俘,什么?這兩年還有人用jquery做前端開發(fā)的么掀序?很遺憾帆焕,當(dāng)時(shí)轉(zhuǎn)Webgl的我確實(shí)跟jquery打交道了大半年,主要原因也許是因?yàn)殇秩緦佑玫絛om的機(jī)會(huì)不太多不恭,也許是因?yàn)楫?dāng)時(shí)確實(shí)不太關(guān)注前端的新技術(shù)叶雹。好吧,主要原因還是因?yàn)槲覀€(gè)人是個(gè)懷舊主義者换吧,這么解釋希望讀者能接受折晦。直到有一天我接觸到了Vue,那一刻我發(fā)覺沾瓦,糟了满着,大半年的jquery白用了,因?yàn)槲乙恢庇X得我在jquery領(lǐng)域真的是有見地贯莺,所以在此我還是把我這個(gè)教訓(xùn)與各位分享风喇,技術(shù)千萬不要閉門造車,也不要有懷舊的心態(tài)缕探,擁抱新技術(shù)是技術(shù)人時(shí)刻應(yīng)該關(guān)注的動(dòng)向魂莫。還是說回接觸到Vue后我的一些感觸,我發(fā)現(xiàn)Vue真的是一個(gè)好東西撕蔼,原本需要操作源數(shù)據(jù)才能改變的視圖豁鲤,只需要用對(duì)象進(jìn)行管理,一旦數(shù)據(jù)改變鲸沮,視圖立馬改變琳骡,通過這種方式很多功能需要繁雜的代碼,現(xiàn)在只需要專注于數(shù)據(jù)層讼溺,而后我們的渲染規(guī)范就變成了經(jīng)常與Vue打交道的過程楣号,有些人可能會(huì)有疑問,用Vue開發(fā)的游戲怒坯,性能會(huì)有問題么炫狱?這個(gè)問題往往讓人很難回答,開發(fā)效率的提升似乎總會(huì)帶來性能的下降剔猿,理論上性能主要在Vue初始化過程會(huì)有影響视译,這取決于場(chǎng)景數(shù)據(jù)與復(fù)雜度,所以大型游戲不建議使用該方案归敬,因?yàn)榇笮陀螒蛞M織的數(shù)據(jù)過多酷含,并且場(chǎng)景物體也過于復(fù)雜鄙早,但是實(shí)際開發(fā)中又會(huì)有些小驚喜,這里我們先不討論這個(gè)話題椅亚,后面有機(jī)會(huì)我會(huì)專門對(duì)優(yōu)化的問題開辟新的章節(jié)進(jìn)行討論限番。回到正題呀舔,開發(fā)后的游戲必然涉及到平臺(tái)的問題弥虐,首先小游戲平臺(tái)必須要首先考慮,于是就有了這個(gè)項(xiàng)目媚赖。

介紹

Gengine 是一個(gè)基于 Vue.js 核心開發(fā)的前端框架霜瘪,與Vue采用Typescript不同,Geg采用的是Es6開發(fā),并修改了 Vue.js 的底層實(shí)現(xiàn)省古,包括了compile與platforms粥庄,并新增gxml部分〔蚣耍框架通過xml組織視圖層級(jí),所以它與底層視圖渲染的方式,如dom的渲染等并沒有直接關(guān)系布讹,也因?yàn)檫@個(gè)特點(diǎn)琳拭,雖然Gengine開發(fā)之初是為了使用Vue兼容微信小游戲而設(shè)計(jì),但是理論上可以使用Geg.js開發(fā)任意特定平臺(tái)的視圖項(xiàng)目描验。

我們可以通過以下關(guān)系來描述Geg.js與MVVM的關(guān)系白嘁。


                              VIEW MODEL

┌----------┐                ┌---------------┐                          ┌----------┐

|          | ---------------| XMLNodeListen ├------------------------> |          |

|          |                |              |                           |          |

|  View    |                |              |                           |   Model  |

|          |                |              |                           |          |

|          | <------------- | Data Bindings ├<------------------------ |          |

└----------┘                └---------------┘                          └----------┘

    |           

    |                         

    |     ┌--------------------------┐

    └---->|  Geg.js Implementation   |

          └--------------------------┘

上面的關(guān)系圖表明View視圖的渲染邏輯需要用Geg.js針對(duì)特定平臺(tái)實(shí)現(xiàn)


安裝


# 克隆項(xiàng)目

git clone https://github.com/GengineJS/geg.git

# 進(jìn)入項(xiàng)目目錄

cd geg

# 安裝依賴

yarn

# 本地開發(fā) 啟動(dòng)項(xiàng)目

yarn min


目錄結(jié)構(gòu)

本項(xiàng)目已經(jīng)為你生成了一個(gè)完整的開發(fā)框架,提供了Geg.js開發(fā)過程中的源碼結(jié)構(gòu)膘流,下面是整個(gè)項(xiàng)目的目錄層級(jí)絮缅。


├── dist                      # rollup源碼構(gòu)建輸出

├── src                      # 源代碼

│   ├── compiler              # 編譯相關(guān)

│   ├── core                  # 源碼核心

│   ├── platforms            # 平臺(tái)相關(guān)

│   ├── sfc                  # parser相關(guān)

│  └── index.js              # 源碼入口

├── .babelrc                  # babel-loader 配置

├── config.js                # rollup配置

├── index.html                # 測(cè)試入口html

├── package.json              # package.json

├── test.xml                  # 測(cè)試xml模版相關(guān)

├── yarn-error.log            # 構(gòu)建錯(cuò)誤log

└── yarn.lock                # 構(gòu)建依賴相關(guān)


初始化

Geg.js是以微信小游戲平臺(tái)為開發(fā)初衷,那么我們以微信小游戲平臺(tái)Geg-Babylonjs為例,可分為三種初始化方式

1. 加載xml文件呼股。

由于Gengine不對(duì)dom進(jìn)行直接操作,所以這里的el傳遞的是xml路徑


import GegBabylon from './gegbabylon/index.js'

import Geg from './libs/geg.js'

Geg.use(GegBabylon)

let geg = new Geg({

  el: 'src/template.xml'

})

xml格式如下,外層必須通過template進(jìn)行定義耕魄,說明其內(nèi)部元素為解析模版


<template>

  <engine>

    <scene>

      <camera type="ArcRotateCamera"></camera>

      <light></light>

      <skybox></skybox>

      <mesh type="Sphere" :position="sPosition">

        <physics :mass="10"></physics>

      </mesh>

    </scene>

  </engine>

</template>

2. Geg對(duì)象內(nèi)部定義template字符串。


import GegBabylon from './gegbabylon/index.js'

import Geg from './libs/geg.js'

Geg.use(GegBabylon)

let geg = new Geg({

  el: 'src/template.xml',

  template: "<engine><scene><camera type='ArcRotateCamera'></camera></scene></engine>"

})

3. 通過render與$mount方式彭谁。


import GegBabylon from './gegbabylon/index.js'

import Geg from './libs/geg.js'

Geg.use(GegBabylon)

let geg = new Geg({

    components: { App },

    render: (h) => h('App')

}).$mount()


官網(wǎng)地址

https://gegjs.com

其他語法

想了解更多語法指南吸奴,可參考Vuejs

生態(tài)圈

除了Vuejs對(duì)應(yīng)插件外,還可以通過以下插件進(jìn)行Gengine開發(fā)

  1. Geg-Babylonjs 通過Gengine實(shí)現(xiàn)對(duì)Babylonjs 3D引擎的操作。

  2. Geg-Threejs 通過Gengine實(shí)現(xiàn)對(duì)Threejs 3D引擎的操作缠局。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末则奥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子狭园,更是在濱河造成了極大的恐慌读处,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唱矛,死亡現(xiàn)場(chǎng)離奇詭異罚舱,居然都是意外死亡俊戳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門馆匿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抑胎,“玉大人,你說我怎么就攤上這事渐北“⑻樱” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵赃蛛,是天一觀的道長恃锉。 經(jīng)常有香客問我,道長呕臂,這世上最難降的妖魔是什么破托? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮歧蒋,結(jié)果婚禮上土砂,老公的妹妹穿的比我還像新娘。我一直安慰自己谜洽,他們只是感情好萝映,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阐虚,像睡著了一般序臂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上实束,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天奥秆,我揣著相機(jī)與錄音,去河邊找鬼咸灿。 笑死构订,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的析显。 我是一名探鬼主播鲫咽,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼谷异!你這毒婦竟也來了分尸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤歹嘹,失蹤者是張志新(化名)和其女友劉穎箩绍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尺上,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡材蛛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年圆到,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卑吭。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芽淡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出豆赏,到底是詐尸還是另有隱情挣菲,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布掷邦,位于F島的核電站白胀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏抚岗。R本人自食惡果不足惜或杠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宣蔚。 院中可真熱鬧向抢,春花似錦、人聲如沸件已。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽篷扩。三九已至,卻和暖如春茉盏,著一層夾襖步出監(jiān)牢的瞬間鉴未,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國打工鸠姨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铜秆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓讶迁,卻偏偏與公主長得像连茧,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巍糯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • 基于Vue的一些資料 內(nèi)容 UI組件 開發(fā)框架 實(shí)用庫 服務(wù)端 輔助工具 應(yīng)用實(shí)例 Demo示例 element★...
    嘗了又嘗閱讀 1,156評(píng)論 0 1
  • UI組件 element - 餓了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的組...
    魯大師666閱讀 43,408評(píng)論 5 97
  • UI組件 element - 餓了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的組件庫...
    卞卞村長L閱讀 1,716評(píng)論 0 8
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    小姜先森o0O閱讀 9,515評(píng)論 0 72
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    王喂馬_閱讀 6,455評(píng)論 1 77