從零開始寫一個武俠冒險游戲-0-開發框架Codea簡介
- 作者:FreeBlues
- 修訂記錄
- 2016.06.21 初稿完成.
- 2016.08.03 增加對
XCode
項目文件的說明.
概述
本游戲全程使用一款運行於 iPad
上的開發工具類 APP
--Codea
來開發, Codea
是一款 輕量級
+ 全功能
的開發工具, 它既是一個:
運行時庫-Runtime
也是一個:
框架-Frameworks
還是一個:
集成開發環境-IDE
更是一個:
調試服務器-debugSever
, 可通過瀏覽器來雲端調試代碼.
它還是 Lua
語言的一種擴展, 本質上它就是一個運行於 iPad
上可以動態加載運行 Lua
代碼的應用程序.
它實現了一個非常易於使用的編程框架(類似於 Processing
和 OpenFrameWorks
):
setup()
函數, 負責初始化工作, 程序啟動時運行一次;draw()
函數, 負責屏幕繪制,1
秒鍾刷新60
次;touched(touch)
函數, 負責處理屏幕觸摸;keyboard(key)
函數, 負責處理鍵盤操作;collide(contact)
函數, 負責處理物理模擬中的碰撞檢測;orientationchanged(newOrientation)
函數, 負責檢測屏幕位置(是否翻轉)
用它提供的功能豐富的函數你可以在 iPad
上編寫各種程序, 它提供了:
基本繪圖函數
, 實現一些基本的繪圖函數高級繪圖函數
, 支持OpenGL ES 2.0/3.0
, 直接編寫shader
代碼, 即時查看運行結果;Lua 語言的大多數函數
, 如table
相關,string
相關,os
相關, 以及math
相關的一些函數, 還包括協程coroutine
;Lua 的一些庫
, 如socket
,lpeg
,json
觸控函數
, 負責處理屏幕觸摸事件;調試函數
, 負責處理程序調試工作;物理模擬函數
, 封裝box2D
提供了相關的物理模擬函數;動畫函數
, 一個專門的動畫類, 可以利用它來實現各種動畫效果;聲音函數
, 負責處理播放聲音以及生成各種音效;顯示函數
, 負責處理顯示模式設置以及視頻錄制等等矢量函數
, 提供了二維, 三維, 四維向量以及相關的各種操作;傳感器函數
, 負責處理GPS
定位傳感器和加速度
傳感器;網絡函數
, 提供了封裝后的http.request()
函數存儲函數
, 提供了各種存取函數, 用於存取游戲數據到iPad
上.
它提供了一個 IDE
, 可以編輯/調試/運行
代碼, 非常適合觸屏操作. 也非常適合那些希望能隨時隨地拿起平板就能編程的開發者, 據本軟件開發者 Simen
自述, 最初就是因為他想在平板電腦上隨時運行一些代碼片段, 於是萌生了這個想法, 結果一步步搞出這么一個超級方便很受歡迎的 iPad
開發工具來.
它可以把你編寫的代碼導出為一個 XCode
項目, 然后編譯成一個真正的 APP
發布到 APP Store
, 當然了, 需要你擁有一個開發者賬號.
我用過很多 iPad
上的編程工具, 最喜歡的一款是 Codea
, 而且為了更好地發揮它的作用, 專門去認真學了 Lua
.
接下來我們會對 Codea
做一個介紹, 讓讀者對我們后續即將使用的開發工具有一個初步了解.
界面
啟動進入
啟動 Codea
后進入主界面, 如下:
示例
Codea
自帶了一些示例程序, 如下:
左側菜單欄
點開左側菜單欄, 出現 4
個選項
內置函數手冊
在 Codea
中內置了全部的函數說明, 非常方便在編程時隨手查閱
shader實驗室
左側菜單欄的第二項是一個 shader
實驗室, 你可以在里面調試自己的 shader
代碼
自帶素材庫
左側菜單欄第三項是 Codea
自帶的素材庫, 有一些可以免費使用的圖片素材和音樂音效素材, 還有一些 shader
模板, 用戶也可以自行添加素材到素材庫
編輯界面
編輯界面自帶聯想輸入, 非常方便直接在 Codea
上輸入代碼
程序框架說明
Codea
的運行機制是這樣的:
setup()
只在程序啟動時執行一次draw()
在程序執行完setup()
后反復循環執行, 每秒執行60
次touched()
跟draw()
類似, 也是反復循環執行
簡單說, 就是類似於這樣的一個程序結構:
setup()
while true do
...
draw()
touched(touch)
...
end
如果讀者有過使用 Processing
或 OpenFrameWorks
的經驗, 就比較熟悉這種框架了, 這種框架的優點就是結構簡單易懂, 流程非常清晰, 容易上手, 而且功能也不弱, 反而 Cocos2d-x
的那種又是場景, 又是導演的框架比較麻煩.
如果你願意, 也很容易在它的基礎上自己搞一個 MVC
架構出來, 如果你想實現更復雜的流程控制, 可以通過 Lua
的 coroutine
自行擴展, 也可以參考本教程提供的用 coroutine
實現的 Threads
類.
主要函數說明
Codea
的函數大多數都支持可變參數, 根據輸入實參的個數決定對應哪些形參, 好像在面向對象中叫多態. 下面在每種函數中選擇兩個常用的函數
基本繪圖函數
-
background( )
- 語法
- background( gray )
- background( gray, alpha )
- background( red, green, blue )
- background( red, green, blue, alpha )
- background( color )
-
rect( )
- 語法
- rect( x, y, width, height )
-
sprite( name, x, y )
- 語法
- sprite( name, x, y )
- sprite( name, x, y, width )
- sprite( name, x, y, width, height )
- sprite( image, x, y )
- sprite( image, x, y, width )
- sprite( image, x, y, width, height )
高級繪圖函數
提供 shader
和 mesh
支持 OpenGL ES 2.0/3.0
Lua 語言
Lua
中的 表
, 時間
,字符串
和數學運算
以及一部分 os
函數
觸控函數
負責處理屏幕觸摸事件;
調試函數
負責處理程序調試工作;
物理模擬函數
封裝 box2D
提供了相關的物理模擬函數;
動畫函數
一個專門的動畫類, 可以利用它來實現各種動畫效果;
聲音函數
負責處理播放聲音以及生成各種音效;
顯示函數
負責處理顯示模式設置以及視頻錄制等等
矢量函數
提供了二維, 三維, 四維向量以及相關的各種操作;
傳感器函數
負責處理 GPS
定位傳感器和 加速度
傳感器;
網絡函數
提供了封裝后的 http.request()
函數
存儲函數
提供了各種存取函數, 用於存取游戲數據到 iPad
上.
其他在 iPad 上運行的開發工具
除了 Codea
, 還有很多可以運行在 iPad
上的編程工具, 比如 Processing
, TechBASIC
等等, 它們各有所長.
蘋果在最近的 WWDC
上宣布 iOS 10
會提供一款名為 Swift Playground
的免費開發工具, 看來隨着平板電腦性能的提升, 用平板編寫代碼已經是趨勢所向.
如何使用本教程中的源碼
你有兩種方式來運行本教程的示例, 一種是下載源碼, 直接在 iPad
上通過 Codea
來運行, 另一種是下載對應的 XCode
項目文件包, 然后在 XCode
中把它編譯為一個 ipa
應用, 再把它加載到模擬器上運行.
直接在 iPad 上用 Codea 加載代碼
如果你有 iPad
, 並且購買了 Codea
, 那么你可以打開 Codea
, 新建一個項目, 把例程代碼拷貝進去, 同時要把例程中用到的圖像資源下載拷貝到 Codea
的素材庫目錄下, 一般是 Documents
, 然后就可以運行了.
這種方法最簡單, 也最方便, 唯一的不便之處是需要預先手動下載保存好圖片素材(不過后續我會寫幾個自動下載保存圖片的函數來提供更方便的使用)
通過 XCode 的 iOS 模擬器來運行
如果你沒有 iPad
, 或者雖然有 iPad
, 但是暫時還不准備花 15
美元購買一份 Codea
, 那么你還可以通過模擬器來運行.
這就需要你有一台安裝了 XCode
的 Mac
電腦, 或者你有一個安裝了 XCode
的 OSX
虛擬機, 你只要把每章對應的 XCode
項目文件包下載回去, 然后在 XCode
中打開它, 編譯運行, 就可以在模擬器中看到運行結果了.
而且你也可以在 XCode
中修改代碼, 重新編譯查看效果.
XCode項目文件夾結構
項目文件夾結構如下:
Air:Write-A-Adventure-Game-From-Zero admin$ tree
.
MyAdventureGame
├── Assets
│ ├── ...
├── Libs
│ ├── ...
├── MyAdventureGame
│ ├──...
├── MyAdventureGame.codea
│ ├──...
├── MyAdventureGame.xcodeproj
│ ├──...
└── libversion
其中我們編寫的 Lua
腳本放在 MyAdventureGame.codea
目錄下, 以 main.lua
命名, 如下:
Air:Write-A-Adventure-Game-From-Zero admin$ tree ./MyAdventureGame/MyAdventureGame.codea
./MyAdventureGame/MyAdventureGame.codea
├── Info.plist
├── Main.lua
├── Sprites.lua
└── Status.lua
0 directories, 4 files
Air:Write-A-Adventure-Game-From-Zero admin$
Codea的運行時庫文件
- 注意: 在用
XCode
編譯項目時, 需要用到Codea
的兩個庫文件:libcodea.a
和libtools.a
.
當前版本 2.3.2
, XCode
會自動從 Codea
官網下載, 不過貌似會被屏蔽, 再加上這兩個文件稍微大了點(一個20
M, 一個 50
M), 就沒有放在 github
上, 改為放到百度網盤上Codea庫文件下載, 下載回來后解壓得到名為 libcodea.a
和 libtools.a
的兩個文件, 將其拷貝到項目文件夾的 Libs
目錄下即可.
參考資源
所有章節鏈接
Github項目地址
Github項目地址, 源代碼放在 src/
目錄下, 圖片素材放在 assets/
目錄下, XCode
項目文件放在 MyAdventureGame
目錄下, 整個項目文件結構如下:
Air:Write-A-Adventure-Game-From-Zero admin$ tree
.
├── MyAdventureGame
│ ├── Assets
│ │ ├── ...
│ ├── Libs
│ │ ├── ...
│ ├── MyAdventureGame
│ │ ├──...
│ ├── MyAdventureGame.codea
│ │ ├──...
│ ├── MyAdventureGame.xcodeproj
│ │ ├──...
│ └── libversion
├── README.md
├── Vim 列編輯功能詳細講解.md
├── assets
│ ├── ...
│ └── runner.png
├── src
│ ├── c01.lua
│ ├── c02.lua
│ ├── c03.lua
│ ├── c04.lua
│ ├── c05.lua
│ ├── c06-01.lua
│ ├── c06-02.lua
│ ├── c06-03.lua
│ └── c06.lua
├── 從零開始寫一個武俠冒險游戲-0-開發框架Codea簡介.md
├── 從零開始寫一個武俠冒險游戲-1-狀態原型.md
├── 從零開始寫一個武俠冒險游戲-2-幀動畫.md
├── 從零開始寫一個武俠冒險游戲-3-地圖生成.md
├── 從零開始寫一個武俠冒險游戲-4-第一次整合.md
├── 從零開始寫一個武俠冒險游戲-5-使用協程.md
├── 從零開始寫一個武俠冒險游戲-6-用GPU提升性能(1).md
├── 從零開始寫一個武俠冒險游戲-6-用GPU提升性能(2).md
└── 從零開始寫一個武俠冒險游戲-6-用GPU提升性能(3).md
2 directories, 26 files
Air:Write-A-Adventure-Game-From-Zero admin$