小游戲的組成
-
歡迎界面
在游戲資源未全部加載完之前就需要載入,避免進入游戲會有一段黑屏時間。
可以用來展示游戲名稱或者開發者logo。
-
開始菜單界面
一般用於顯示游戲名稱和關卡選擇(或者稱游戲難度選擇)。
可以外加一些設置性功能,如聲音開關,幫助入口等等。
如果游戲設置內容較多可以把設置作為一個單獨界面,在開始菜單上提供入口即可。
有的小游戲是以彈窗方式的菜單
-
主游戲界面
游戲的中心部分,比如2048游戲的格子滑動界面,掃雷游戲的掃雷界面,貪吃蛇游戲的蛇移動的界面,等等。
小游戲擁有這一個界面也能算一個小游戲,但是沒有其他界面會使游戲缺少更多選擇。
游戲的主要邏輯都是在完成這個界面。
-
游戲結束界面
游戲結束一般都會有個分數,用於展示本次游戲得分和歷史最高得分對比。
在這個界面上可以添加再玩一次的按鈕,讓玩家重新玩一次。
大多數小游戲都是以彈窗的方式展示游戲結果。
-
排行榜界面 (可選)
游戲中有分數這個概念就會有排名。
可以是單機的排行榜,也可以是聯機的排行榜(需要服務器保存數據)。
排行榜可以促進玩家拿到更高的分數(也是有缺點的,看到其他玩家玩的分數太高了而放棄了)。
cocos2d-x v3.1 lua 框架的使用
-
lua代碼結構
src
├── conf.lua # 配置文件,一些不變的配置保存在這里
├── GameOverScene.lua # 游戲結束的界面
├── GameScene.lua # 游戲主邏輯界面
├── HelloScene.lua # 歡迎界面,在這里做資源更新檢測
├── main.lua # 游戲lua腳本的入口
├── MainMenuScene.lua # 游戲主菜單界面
├── RankScene.lua # 排行榜界面
└── util.lua # 通用功能函數實現
每個XXOOScene.lua 文件的樣子如下:
local XXOOScene = {} XXOOScene.newScene = function () local scene = cc.Scene:create() -- do other XXOO things return scene end return XXOOScene
關於Scene界面跳轉,在util中封裝一個通用函數用於界面跳轉。
function util.toScene(scene) -- 增加一個統一的界面跳轉動畫 scene = cc.TransitionSlideInR:create(0.5, scene) if cc.Director:getInstance():getRunningScene() then cc.Director:getInstance():replaceScene(scene) else cc.Director:getInstance():runWithScene(scene) end end
main.lua用戶進入HelloScene界面
-
HelloScene = require("src/HelloScene") local function main() cc.FileUtils:getInstance():addSearchResolutionsOrder("src") cc.FileUtils:getInstance():addSearchResolutionsOrder("res") HelloScene.newScene() end local status, msg = xpcall(main, __G__TRACKBACK__) if not status then error(msg) end
游戲啟動logo的Scene特殊處理
因為加載lua資源需要時間,待所有資源都加載完再創建游戲啟動界面會出現啟動的時候黑屏。我在1G的安卓機上測試需要5秒才能進入到lua創建的Scene。
解決方案:在 C++ 中創建啟動畫面,HelloScene.lua中不做創建Scene的操作,直接getRunningScene。
-
AppDelegate::applicationDidFinishLaunching () { // ... other xxoo things auto scene = Scene::create(); auto s = Director::getInstance()->getWinSize(); auto layer = LayerColor::create(Color4B(255, 255, 255, 255), s.width, s.height); auto logo = Sprite::create("res/logo.png"); layer->addChild(logo); logo->setPosition(Vec2(s.width*0.5,s.height*0.7)); scene->addChild(layer,0); director->runWithScene(scene); // 特殊處理,延遲加載lua(創建好logoScene再加載) auto action = CallFunc::create(startLua); layer->runAction(action); return true; }
cocos2d-x v3.1 引擎的精簡
起因: 引擎編譯完之后發現lib文件相比2.x版本的大了不少。由於是做小游戲,一般都會有用不到的引擎部分,比我我就沒用到ui編輯器,所以就想辦法不編譯ui編輯器部分。
步驟:
找到mk文件: $ find . -name "Android.mk"
修改mk文件,把與ui編輯器相關的語句注釋掉。
編譯,在編譯錯誤提示中找出還有什么需要注釋的代碼。我遇到的問題主要是CCB那些。需要在lua_cocos2dx_extension_manual.cpp中把CCB的代碼注釋。
CCLuaStack.cpp中也需要注釋幾個注冊函數。
我還精簡了物理引擎,剛開始是用到了的,但后面看小游戲用不上就把它也干掉了(大概省下1M)。
-
cocos/scripting/lua-bindings/auto/ 下的文件生成
看README后執行生成命令,遇到了一些問題:
問題1:官方只提供ubuntu 64位的libclang.so文件,在32位機子上跑會報下面這個錯誤
LibclangError: libclang.so: wrong ELF class: ELFCLASS64. To provide a path to libclang use Config.set_library_path() or Config.set_library_file().
解決方法:在llvm官網下載4.3版本的llvm和clang。編譯生成libclang.so.3.4。拷貝到bindings-generator/libclang/下覆蓋libclang.so文件。怎么編譯的那個博客現在找不到了,步驟大概是:
clang-3.4.src.tar.gz 和 llvm-3.4.src.tar.gz 。解壓,然后把clang目錄拷貝到llvm-3.4/tools/下。編譯,在llvm-3.4同一個目錄下建一個build文件夾,進入到build,執行cmake ../llvm-3.4/CMakeLists.txt
文字描述可能不清晰,目錄結構如下:
. -> build | ->llvm-3.4 -> tools -> clang -> CMakeLists.txt |-> CMakeLists.txt
問題2: 找不到頭文件,報錯出現unkown type name ,原因是官方配置的android_headers路徑和我電腦上的不一樣,主要是gcc的版本,我的是4.8的,官方配置是4.7。如下:
details = "unknown type name '__locale_t'"
解決方法:修改cocos2dx.ini中的android_headers 的值把/cxx-stl/gnu-libstdc++/4.7/ 改成/cxx-stl/gnu-libstdc++/4.8/ 。有兩個地方要修改。這個問題要看自己的安卓ndk的配置情況,也許你的還是4.6呢,自己可以去ndk對應的路徑下找找看自己的ndk版本。
全民頂爆菊花
應用寶:http://android.myapp.com/myapp/detail.htm?apkName=com.hanxi.runtodie
百度手機助手:http://as.baidu.com/a/item?docid=6678809
豌豆莢:http://www.wandoujia.com/apps/com.hanxi.runtodie
代碼地址:https://github.com/hanxi/cocos2d-x-v3.1
【加幾張游戲效果圖】