cocoslua游戲源碼
① cocos lua 是怎麼調用c++的
使用cocos2dx-lua開發,免不了自己定義類,但是如何使用自定義的類的?先了解下lua如何調用c++的:lua腳本代碼->通過coocs2dx中間解析層代碼->將其轉換並調用cocos2dxc++的前端代碼coocs2dx中間解析層代碼都在libs/lua/cocos2dx_support/LuaCocos2d.cpp這個文件中,想了解的可以自己去看下這個文件。也就是說,你自己定義了一個類,lua能夠調用你自己定義的類,你的自定義類就必須在LuaCocos2d.cpp這個中間解析文件中申明。看了LuaCocos2d.cpp這個文件,可能有的同學都暈了,不知道怎麼在LuaCocos2d.cpp中申明自己的定義的類。不過,不用擔心,cocos2dx已經提供了tolua++這個工具自動編譯生成新的LuaCocos2d.cpp文件。下面開始進入正題。一、創建一個coocs2dx-lua的Demo工程,然後在class中自己定義個類。SNSprite.h[/cpp]////SNSprite.h//LuaDemo////CreatedbyLiuYanghuion13-4-8.////#ifndef__LuaDemo__SNSprite__#define__LuaDemo__SNSprite__#include「cocos2d.h」USING_NS_CC;classSNSprite:publicCCSprite{public:staticSNSprite*create(constchar*name);private:voidinitData();};#endif/*defined(__LuaDemo__SNSprite__)*/[/cpp]SNSprite.cppC++localfunctioncreateSunnyLayer()locallayerSunny=CCLayer:create()locallabTips=CCLabelTTF:create("這個icon圖標就是使用的自定義類","Arial",18)labTips:setPosition(ccp(240,280))layerSunny:addChild(labTips)localsp=SNSprite:create("Icon.png")sp:setPosition(ccp(100,100))layerSunny:addChild(sp)returnlayerSunnyend--playbackgroundmusic,preloadeffect添加到scene中:C++--runlocalsceneGame=CCScene:create()--創建場景--sceneGame:addChild(createLayerFarm())--將農場層加入場景--sceneGame:addChild(createLayerMenu())--將菜單界面層加入場景sceneGame:addChild(createSunnyLayer())CCDirector:sharedDirector():runWithScene(sceneGame)OK,xcode編譯運行,就看到效果了。
② 如何使用Cocos Code IDE調試Lua開發的游戲
支持調試的環境
在 Windows 上你可以調試Windows和Android游戲,在 Mac 上你可以調試Mac、iOS和Android游戲。我們以 Mac 作為開發環境來演示 Code IDE 的使用,Windows上的流程和這里所介紹的幾乎一樣,不再贅述。
先決條件
如果你還沒有安裝Cocos Code IDE,請參考《如何安裝和設置Cocos Code IDE》
IDE配置
基礎設置
打開工具的 Preferences 頁,切換到 Cocos/Lua 子頁面,選擇你剛剛下載的 Cocos2d-x 3.x 作為 Lua Framework。
額外設置
假設你發現我們提供給你的預編譯的Android runtime不能滿足你的要求,你就需要重新定製,那麼你就需要提供給 IDE 幾個 Android 編譯需要用到的工具。這可以通過打開 Preferences/Cocos 頁面進行配置。
運行、測試游戲
1. 新建一個名為 CocosLuaGame 的 Cocos Lua 工程
2. 點擊工具欄上的Debug按鈕
3. 默認情況下腳本會運行在我們提供的 Mac 版本預編譯 runtime 上。為了簡單起見,我們不對默認值進行任何改動。如果你想要在其他我們支持的目標平台上調試程序,可參考下文的「在其它目標平台上調試」
③ 如何看待cocos creator加入Lua
如果在Cocos Creator裡面只提供JS支持的。這樣就可以很純粹地只用一本編程語言,完成游戲邏輯、編輯器擴展、引擎擴展,引擎一個人輕裝上陣就可以跑得很快,同樣資源投入的情況下開發出更多功能來。
但是Cocos的Lua社區太龐大了。Cocos Creator本身的插件架構是允許隨意擴展的,所以增加一個Lua擴展在技術層面並不難,難的在多一種編程語言之後的維護:
- 增加Lua中英文文檔教程
- 增加Lua API文檔
- 增加Lua測試例
- 增加每個版本發布前的Lua測試
- 增加Lua的論壇技術支持
這些因為『多一門編程語言所帶來的維護成本』這些才是大頭。不過如果這個成本投入可以換來足夠多的開發者數量,那麼也就值得了。
④ 有人會用lua語言在cocos2d上編寫一個簡單的別踩白塊游戲嘛求源代碼
lua和python是最常見的兩種游戲內使用的腳本語言,lua程序設計只會講lua語言的一些內容,具體不會講怎麼使用在游戲里,或者跟其他語言怎麼結合。 具體游戲中的例子可以查查lua在游戲內用法的一些例子,網上有很多的,或者你可以去某個游戲公司上...
⑤ cocos-lua中怎麼用代碼控制手機開啟和關閉游戲震動功能
我寫了一個用3.0的工具導出類到lua,自動生成代碼的方法。
以前要導出c++類到lua,就得手動維護pkg文件,那簡直就是噩夢,3.0以後就會感覺生活很輕鬆了。
下面我就在說下具體做法。
1、安裝必要的庫和工具包,以及配置相關環境變數,請按照cocos2d-x-3.0rc0;tools;tolua;README.mdown說得去做,不做贅述。
2、寫c++類(我測試用的是cocos2d-x-3.0rc0;tests;lua-empty-test;project;Classes;HelloWorldScene.cpp)
3、寫一個生成的python腳本,你不會寫,沒關系,我們會照貓畫虎
1)進入目錄cocos2d-x-3.0rc0;tools;tolua,復制一份genbindings.py,命名為genbindings_myclass.py
2)把生成目錄制定到咱工程里去,打開genbindings_myclass.py把
?
⑥ 如何使用Cocos Studio導出的LUA文件
首先導出的LUA文件是這樣的
這段代碼,首先判斷callBackProvider是否為空,然後呢,將他的返回值設置為Button_1的Click回調函數。
這樣就很明白了。create時候需要傳入的參數callBackProvider是一個函數,他的功能是根據傳入的3個參數進行判斷,最終返回一個函數最為Button(或者其他node)的回調函數!
callBackProvider的三個參數,分別是,當前LUA文件的路徑,所綁定的Node(可以通過name或者tag來判斷是哪個node),最後是回調函數的名字,通過這三個參數可以很容易的知道是哪個按鈕的回調事件,從而返回該按鈕所需要的回調函數。
所以,在create時候應該是這樣的:
localcallBackProvider=function(path,node,funcName)
ifpath=="Scene.lua"andnode:getName()=="Button_1"andfuncName=="bnt2"then
localfunctionbtnCallback(node,eventType)
--TODO
end
returnbtnCallback
end
end
localcsLuaScene=require("Scene.lua").create(callBackProvider)
也許大家看第一篇文章時候,注意到 我這里提示了一個錯誤,版本不兼容。是時候更新到3.5了!如果不想更新的話,就把3.5的UI的部分替換過來吧………
⑦ lua怎麼進入源碼裡面去調試
調試lua現幾種案: 一)luaedit : 編輯斷點斷點命查看些都讓習慣用vs親切純lua環境編輯器說期望程序運行能借用調試腳本能性(至少我沒試驗)能用需要給lua腳本做main腳本函數並提供系列偽c api(由lua實現函數提供製定值返)由luaedit啟腳本main函數進行調試 二)利用 lua debug 庫 hook 記錄張斷點位置表設置行模式 hook 每進入 hook 都檢查否斷點處若停等待交互調試效消耗 cpu 每進入新代碼行都需要調函數函數本身用 lua 寫候效率更低 三)利用lua腳本函數實現lua腳本封裝斷點函數種式結合debug庫實現斷點棧信息利用lua環境表函數調用信息進行記錄列印需要腳本使用者顯式提供斷點函數調用辦優點自組合適合自項目斷點調試案缺點相繁瑣且斷點命難現式融
⑧ 如何在cocos2d c++代碼中調用lua以及探究
如何在cocos2d c++代碼中調用lua以及探究,有需要的朋友可以參考下。
如何在cocos2d c++代碼中調用lua
在AppDelegate 中加入了
#include"Lua_extensions_CCB.h"
#include"CCLuaEngine.h"
#include"Lua_web_socket.h"
查到代碼載入lua腳步引擎
官方原話注冊引擎
CCLuaEngine*pEngine=CCLuaEngine::defaultEngine();
CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine);
和ccb有關的lua
CCLuaStack*pStack=pEngine->getLuaStack();
lua_State*tolua_s=pStack->getLuaState();
tolua_extensions_ccb_open(tolua_s);
和web_socket 相關的lua
pStack=pEngine->getLuaStack();
tolua_s=pStack->getLuaState();
tolua_web_socket_open(tolua_s);
pEngine->executeScriptFile("luaScript/controller.lua");
結束
打開luaScript/controller.lua仔細研究
-- avoidmemory leak
collectgarbage("setpause",100)
collectgarbage("setstepmul",5000)
require"luaScript/mainMenu"
----------------
-- run
local scene =CCScene:create()
scene:addChild(CreateTestMenu())
CCDirector:sharedDirector():runWithScene(scene)
到這里如果熟悉cocos2dx 的朋友就很熟悉了
不錯,這里是cocos2d中lua的使用方法和c++中調用差別不大!
但是還沒有完
Cocos2dx 對lua的封裝是很好的!
如果不熟悉c++與lua的綁定的代碼下面的不建議看
C++與lua的綁定傳送門
關於cocos2d 與 lua綁定的代碼的探究
//打開"CCLuaEngine.h"
單例實現CCScripEngineProtocol
後期應該支持不僅僅只是lua的腳本引擎
頭文件有很多方法
挑一個看看
virtualintexecuteNodeEvent(CCNode*pNode,intnAction);
intCCLuaEngine::executeNodeEvent(CCNode*pNode,intnAction)
{
intnHandler=pNode->getScriptHandler();
if(!nHandler)return0;
switch(nAction)
{
casekCCNodeOnEnter:
m_stack->pushString("enter");
break;
casekCCNodeOnExit:
m_stack->pushString("exit");
break;
:
m_stack->pushString("enterTransitionFinish");
break;
:
m_stack->pushString("exitTransitionStart");
break;
casekCCNodeOnCleanup:
m_stack->pushString("cleanup");
break;
default:
return0;
}
intret=m_stack->executeFunctionByHandler(nHandler,1);
m_stack->clean();
returnret;
}
這里是進入CCNode後的一些消息函數的處理
不管
intret=m_stack->executeFunctionByHandler(nHandler,1);
最終是回到了CCLuaStack
調用了executeFunctionByHandler(nHandler,1);
繼續探究
intCCLuaStack::executeFunctionByHandler(intnHandler,intnumArgs)
{
intret=0;
if(pushFunctionByHandler(nHandler)) /* L: ... arg1 arg2 ... func */
{
if(numArgs>0)
{
lua_insert(m_state,-(numArgs+1)); /* L: ... func arg1 arg2 ... */
}
ret=executeFunction(numArgs);
}
lua_settop(m_state,0);
returnret;
}
可以看到一些和lua與c++聯系的代碼了
看看這個類的初始化
boolCCLuaStack::init(void)
{
m_state=lua_open();
luaL_openlibs(m_state);
tolua_Cocos2d_open(m_state);
toluafix_open(m_state);
// Register our version of the global "print"function
constluaL_regglobal_functions[]={
{"print",lua_print},
{NULL,NULL}
};
luaL_register(m_state,"_G",global_functions);
tolua_CocoStudio_open(m_state);
#if(CC_TARGET_PLATFORM==CC_PLATFORM_IOS||CC_TARGET_PLATFORM==CC_PLATFORM_MAC)
CCLuaObjcBridge::luaopen_luaoc(m_state);
#endif
register_all_cocos2dx_manual(m_state);
register_all_cocos2dx_extension_manual(m_state);
register_all_cocos2dx_studio_manual(m_state);
// add cocos2dx loader
addLuaLoader(cocos2dx_lua_loader);
returntrue;
}
這個里的方法看名稱應該是注冊 coco2dx 中的類到
C++中
register_all_cocos2dx_manual(m_state);
register_all_cocos2dx_extension_manual(m_state);
register_all_cocos2dx_studio_manual(m_state);
詳細看
Coco2dx-studio 先不看
頭文件
lua_cocos2dx_manual.h
#ifdef__cplusplus
extern"C"{
#endif
#include"tolua++.h"
#ifdef__cplusplus
}
#endif
LUA_APIintregister_all_cocos2dx_manual(lua_State*tolua_S);
頭文件
lua_cocos2dx_extensions_manual
#ifdef__cplusplus
extern"C"{
#endif
#include"tolua++.h"
#ifdef__cplusplus
}
#endif
LUA_APIintregister_all_cocos2dx_extension_manual(lua_State*tolua_S);
驚人的相似
看看tolua++.h
真相快水落石出了
這里定義了lua所以用到全部函數
這里是頭部,
/* tolua
** Support code for Lua bindings.
** Written by Waldemar Celes
** TeCGraf/PUC-Rio
** Apr 2003
** $Id: $
*/
/* This code is free software; you can redistributeit and/or modify it.
** The software provided hereunder is on an"as is" basis, and
** the author has no obligation to providemaintenance, support, updates,
** enhancements, or modifications.
*/
原來tolua也是lua封裝起來的函數庫,大師2003 4月就寫好了
相當的牛
好上面只看了lua_cocos2dx_extensions_manual.h的頭文件
cpp文件我們也一看詳情
我發現注冊了一些函數
但是不是全部
在CCLuaStack::init()
方法里還有
tolua_Cocos2d_open(m_state);
這個方法
相應的頭文件是LuaCocos2d..h
可以打開看看詳情
Luacocos2d..cpp注冊了n多函數
我用注冊是相對於lua而言
Luacocos2d.cpp代碼賊多
有興趣的童鞋可以看看
看來什麼時間要看看cocos2d studio 的代碼
緊跟時代的步伐
不能老是cocos builder