ejoy2d原始碼閱讀筆記1

2021-06-28 00:38:10 字數 3030 閱讀 7366

一直想學lua,學它如何與c結合來作邏輯,所以找了雲風的乙份**來研究。這份**是個框架庫,叫ejoy2d,據云風的部落格說,他們最新的手機遊戲用的就是這套框架,所以實用性應該很強,雖然我不是學遊戲的,但應該也能學習到很多。

話不多說,開始看原始碼。

框架支援windows, linux, ios三種環境,這裡只看windows的,用的是mingw。

程式入口main在 window.c:

1. 建立視窗

2.ejoy2d_win_init用來初始化ejoy2d

3. 進行windows訊息迴圈

ejoy2d_win_init定義在winfw.c中,一共就下面這幾步:

1. create_game 初始ejoy2d引擎

2. 載入初始化指令碼startscript

3. lua_pcall這裡呼叫了一下,調的哪個函式下面說

4. screen_init

5. ejoy2d_game_start

先看看create_game到底做了啥:

1. 建立lua_state

2. 開啟一堆庫,包括了所有的ejoy2d的庫

3. shader_init 初始化shader環境

4. label_load 載入字型(不知道為啥字型叫label。。。回頭細看)

再看看載入的startscript是個啥:

local path, script = ...

require("ejoy2d.framework").workdir = ''

assert(script, 'i need a script name')

path = string.match(path,[[(.*)\[^\]*$]])

package.path = path .. [[\?.lua;]] .. path .. [[\?\init.lua;.\?.lua;.\?\init.lua]]

local f = assert(loadfile(script))

f(script)

因為最後生成的ej2d.exe呼叫時是ej2d.exe ***.lua,所以根據上面的**,那麼path中就會儲存ej2d.exe的所在路徑,而script則儲存***.lua,所以上面這段指令碼最後會設定package的搜尋路徑(這裡為後面自定義指令碼載入ejoy2d的lua庫做好鋪墊),同時執行給定的指令碼。

看到這裡,應該能明白上面第3步裡其實就是執行的這段指令碼,至於為啥不用dofile來載入startscript,是想在這裡列印錯誤資訊的原因。

行,到這兒create_game看完了,再回到ejoy2d_win_init接著往下看。

screen_init,**裡很簡單,就是初始化好opengl的viewport。

ejoy2d_game_start這個函式看**,應該是依次調了ejoy_initejoy2d_updateejoy2d_drawframe這三個函式,不過這裡用到了lua_registryindex這個東西,lua我不熟,所以看看pil後又結合網上其他人的說法,這是lua的「登錄檔」,這個東西其實也是一張表,但是一張全域性的表,可以通過偽索引來搜尋,貌似是比其他的方式快?

好的,問題來了:挖掘機技術哪家。。。打住,不是這個,而是ejoy_initejoy2d_updateejoy2d_drawframe這三個函式是從哪兒來的,原始碼裡沒有找到對應的實現,沒辦法,只能看看example了。

略過 examples/ex01.lua 前面的一堆**,我們看到這個:

local game = {}

function game.update()

endfunction game.drawframe()

-- use shader.draw to draw a polygon to screen (for debug use)

shader.draw(texid, )

endfunction game.touch(what, x, y)

endej.start(game)

這裡定義了乙個game物件,實現了三個方法:update, drawframe, touch,最後作為引數傳入了ej.start裡。等等,前兩個函式好像跟上面的有關係。看看ej.start(game)都幹了些什麼。

開啟 ejoy2d/init.lua:

function fw.ejoy2d_init()

shader.init()

endfunction ejoy2d.start(callback)

fw.ejoy2d_update = assert(callback.update)

fw.ejoy2d_drawframe = assert(callback.drawframe)

fw.ejoy2d_touch = function(x,y,what,id)

return callback.touch(touch[what],x,y,id)

endfw.ejoy2d_gesture = function(what, x1, y1, x2, y2, state)

return callback.gesture(gesture[what], x1, y1, x2, y2, state)

endfw.inject()

end

哈,這裡把剛才game中定義的三個方法都放到對應的ejoy2d_xx裡了,同時呼叫inject函式,完成了lua函式的注入。此時再回到ejoy2d_game_start中,一切合理了。

ubuntu 64位編譯ejoy2d,解決視窗閃退

一開始是在centos 64位上面編譯,但是依賴太難弄了,後來在ubuntu 64位上來編譯ejoy2d。1 按照readme的提示先安裝glew 編譯glew的依賴庫 apt get install libxmu dev apt get install libxi dev apt get inst...

EventBus原始碼閱讀筆記(1)

本例子基於eventbus2.4.0的原始碼,全部筆記都以的方式呈現,因為在部落格上貼上 實在難看。1.閱讀原始碼時使用的例子,包名是com.subuju.eventbus 2.進入eventbus.getdefault 4.繼續看另乙個過載的構造方法 5.好了,執行到這裡,就完成了eventbus...

閱讀筆記 fsnotify原始碼閱讀

fsnotify的github位址是 fsnotify是乙個資料夾監控應用。可以使用建立乙個watcher來對某個資料夾進行監控 檔案目錄很簡單,實際就兩個程式檔案,fsnotify.go 和 各平台的fsnotify go 後乙個檔案是各個不同平台的實現 example test.go中給的是最簡...