本站文章均為[?李華明Himi?](http://www.himigame.com/about-himi)原創,轉載務必在明顯處注明:
轉載自[【黑米GameDev街區】](http://www.himigame.com/)?原文鏈接:?[http://www.himigame.com/iphone-cocos2dx/681.html](http://www.himigame.com/iphone-cocos2dx/681.html "【iOS-cocos2d-X")
[? 點擊訂閱 ?](http://list.qq.com/cgi-bin/qf_invite?id=acfc24e272cc4a26debf3b3866edb626a9ea3fc80fd8893c)**?本博客最新動態!及時將最新博文通知您!
對于游戲公司而言,采用游戲腳本lua、python等進行開發也很常見,但是很多童鞋對腳本并沒有很熟悉的概念,本篇則向大家簡單介紹腳本的用途以及在Cocos2dx基礎用法;
Lua和python這些詳細介紹的話,請不太熟悉的童鞋自行百度百科哈,那么對于lua和python則是兩個常用的腳本語言,lua相對于python而言,lua比較輕量級罷了,而其他區別就不多說了,但是為什么本章要講解lua的原因則有兩點,首先第一:cocos2dx 游戲引擎內嵌lua,第二點:自從“令人憤怒的小鳥”火起來之后,國內很多都偏向于使用lua了=。 =
那么對于腳本的用途這里也大概說兩點:
1\. ?腳本在手游中是類于“大腦”的功能,所有游戲相關的邏輯代碼一般都放在腳本中,而客戶端(前臺)的代碼都則屬于“肢體”,也可以說是“播放器”,作用只是用戶展示出UI界面的功能;那么腳本的作用那么不僅僅如此,比如地圖數據等都可以利用腳本使用;
2\. 腳本在手機網游中的作用尤為重要,比如一款網游“Himi”沒有使用腳本,如果“Himi”1.0版本在發布后突然發現客戶端出現一些棘手的bug需要修復,那么你想修改那么也要等待再次更新客戶端重新提交發布才可以解決,這樣會流失一大批用戶,而且游戲每次更新也會流失掉部分用戶,這是肯定的;但是如果“Himi”這款網游使用腳本的話,那么解決此類問題很eazy,比如我在“Himi”游戲中的邏輯代碼都放在腳本a.lua 中,那么如果a.lua邏輯中哪里出現了問題,我們直接可以將修復后的a.lua腳本更新至服務器中,因為一般腳本都會定義version號,比如a.lua有bug的version:1.0,那么我們修復后的a.lua version改成1.1,當用戶每次啟動游戲的時候,客戶端都會將腳本的version與服務器腳本version做對比,當server端腳本version號比當前腳本新,那么自動下載并覆蓋當前腳本,OK,問題解決;不僅僅如此,比如游戲中做個活動呀,換個圖片呀等等都可以即使更新,而不是每次修改前端代碼都要重新發布新的游戲版本,造成一些損失!
OK,不再多說了,下面我們來介紹在Cocos2dx中對于lua腳本的一些簡單使用,首先我們通過新建一個Cocos2dx-lua模版項目,默認此模版中有個示例,童鞋們可以直接運行項目看效果,但是大家可能會郁悶在class中完全找不到任何相關的代碼?!?那就對了,因為所有邏輯代碼都放置在了lua腳本中,項目啟動后直接解析的一個名稱為hello.lua的腳本!
打開項目的Resources仔細找下,有沒有發現有 hello.lua 合hello2.lua兩個腳本文件?!OK,就是這里拉。 那么對于cocos2dx_lua demo的例子腳本我這里不多說比較容易,但是肯定不太熟悉的童鞋比較疑惑,那么Himi這里重新整理了一份簡單的示例腳本代碼,大家可以直接將如下代碼直接復制到hello.lua中看效果;代碼如下:
~~~
require "hello2" -- 包含hello2這個腳本
-- 注視語句
-- 基本上調用的cocos2dx函數和類的時候就是以cocos2d.*這樣子來用
-- 注意2:function 關鍵字定義函數,end結束函數
-- 打印
cocos2d.CCLuaLog("腳本hello開始運行... " .. myadd(3, 5))
-- 創建一個Scene
sceneForWorld = cocos2d.CCScene:node()
-- 創建一個Layer
layerForWorld = cocos2d.CCLayer:node()
sceneForWorld:addChild(layerForWorld)
-- 創建一個精靈
spriteForWorld = cocos2d.CCSprite:spriteWithFile("Icon.png")
layerForWorld:addChild(spriteForWorld)
-- 獲取屏幕寬高
screenSize=cocos2d.CCDirector:sharedDirector():getWinSize()
-- 設置精靈坐標
spriteForWorld:setPosition(cocos2d.CCPoint(screenSize.width*0.5,screenSize.height*0.5))
-- 設置精靈縮放2倍
spriteForWorld:setScale(2)
-- 添加一個CCLabelTTF (!!!!!!備注!!!!!!)
myLableTTF =cocos2d.CCLabelTTF:labelWithString("Himi- Lua 基礎","Helvetica-Bold",24)
myLableTTF:setPosition(cocos2d.CCPoint(screenSize.width*0.5,screenSize.height*0.5+100))
sceneForWorld:addChild(myLableTTF)
-- 添加一個CCLabelTTF
myLableTTF2 =cocos2d.CCLabelTTF:labelWithString("上面icon跟隨用戶觸屏位置","Helvetica-Bold",24)
myLableTTF2:setPosition(cocos2d.CCPoint(screenSize.width*0.5,screenSize.height*0.5-100))
sceneForWorld:addChild(myLableTTF2)
-- @@@@@@@@@@觸摸事件
--開啟觸摸
layerForWorld:setIsTouchEnabled(true)
-- 注冊觸摸事件
layerForWorld.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHBEGAN, "btnTouchBegin")
layerForWorld.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHMOVED, "btnTouchMove")
layerForWorld.__CCTouchDelegate__:registerScriptTouchHandler(cocos2d.CCTOUCHENDED, "btnTouchEnd")
-- touch handers
pointBegin = nil
function btnTouchBegin(e)
cocos2d.CCLuaLog("btnTouchBegin")
local v = e[1]
local pointMove = v:locationInView(v:view())
pointMove = cocos2d.CCDirector:sharedDirector():convertToGL(pointMove)
spriteForWorld:setPosition(cocos2d.CCPoint(pointMove.x,pointMove.y))
end
function btnTouchMove(e)
cocos2d.CCLuaLog("btnTouchMove")
local v = e[1]
local pointMove = v:locationInView(v:view())
pointMove = cocos2d.CCDirector:sharedDirector():convertToGL(pointMove)
spriteForWorld:setPosition(cocos2d.CCPoint(pointMove.x,pointMove.y))
end
function btnTouchEnd(e)
cocos2d.CCLuaLog("btnTouchEnd")
end
-- @@@@@@@@@@觸摸結束
--動態小狗
winSize = cocos2d.CCDirector:sharedDirector():getWinSize()
FrameWidth = 105
FrameHeight = 95
textureDog = cocos2d.CCTextureCache:sharedTextureCache():addImage("dog.png")
frame0 = cocos2d.CCSpriteFrame:frameWithTexture(textureDog, cocos2d.CCRectMake(0, 0, FrameWidth, FrameHeight))
frame1 = cocos2d.CCSpriteFrame:frameWithTexture(textureDog, cocos2d.CCRectMake(FrameWidth*1, 0, FrameWidth, FrameHeight))
spriteDog = cocos2d.CCSprite:spriteWithSpriteFrame(frame0)
spriteDog:setPosition(cocos2d.CCPoint(100, winSize.height/4*3))
layerForWorld:addChild(spriteDog)
animFrames = cocos2d.CCMutableArray_CCSpriteFrame__:new(2)
animFrames:addObject(frame0)
animFrames:addObject(frame1)
animation = cocos2d.CCAnimation:animationWithFrames(animFrames, 0.5)
animate = cocos2d.CCAnimate:actionWithAnimation(animation, false);
spriteDog:runAction(cocos2d.CCRepeatForever:actionWithAction(animate))
--自定義函數
function prForHimi()
cocos2d.CCLuaLog("reFresh function")
--取消選擇器
--cocos2d.CCScheduler:sharedScheduler():unscheduleScriptFunc("prForHimi")
end
--使用選擇器進行函數更新
--cocos2d.CCScheduler:sharedScheduler():scheduleScriptFunc("prForHimi", 1, false)
--循環語句
for i=0,4,1 do
for j=0,4,2 do
cocos2d.CCLuaLog("for loop",i)
end
end
-- 避免內存泄漏
collectgarbage( "setpause", 100)
collectgarbage( "setstepmul", 5000)
-- 播放背景音樂
--CocosDenshion.SimpleAudioEngine:sharedEngine():playBackgroundMusic("background.mp3", true)
-- 播放音效
--CocosDenshion.SimpleAudioEngine:sharedEngine():preloadEffect("effect1.wav")
-- run整個scene
cocos2d.CCDirector:sharedDirector():runWithScene(sceneForWorld)
cocos2d.CCLuaLog("腳本hello正常執行結束... " .. myadd(3, 5))
~~~
運行效果圖如下:[](http://www.himigame.com/wp-content/uploads/2012/03/11113.png)
對于Himi上面給出的自己修改后的代碼注視寫的狠清楚了 =。 = 所以不多加贅述,但是Himi這里需要還要詳細說一點;
腳本lua等一般都示通過中間層(解析)進行與前端代碼(Cocos2dX封裝的引擎類庫)交互,所以很多方法名稱可能發生了改變,那么對于不太熟悉的童鞋我們如何下手?
OK,如剛才的代碼中有個“備注”,不知道細心童鞋們看到沒有,這里是添加了一個CCLabelTTF ,假如我們不知道它的構造函數是否有修改,或者說參數忘記都是什么了,那么請打開你項目的libs文件夾,然后打開lua文件夾,繼續打開cocos2dx_support文件夾找到 LuaCocos2d.cpp文件打開,(注意這個文件代碼很多,打開較慢)然后你會看到很多方法的定義與實現!
那么假如我們來找 CCLabelTTF的構造方法,那么搜一下如下語句:
~~~
tolua_beginmodule(tolua_S,"CCLabelTTF");
~~~
你將發現此類下方一大批類似的代碼:

沒錯這里就是此類的所有是lua-cocos2dx之間的轉換函數定義,比如常用的CCLabelTTF構造函數:
~~~
tolua_function(tolua_S,"labelWithString",tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01);
~~~
此函數第一參數大家不用理會,第二個參數表示我們使用cocos2d/x時調用的函數名稱,后面則是lua-cocos2dx之間的轉換函數實現代碼,大家可以繼續搜索第三個參數或者按住command然后點擊第三個參數找到其函數實現代碼:
~~~
/* method: labelWithString of class cocos2d::CCLabelTTF */
#ifndef TOLUA_DISABLE_tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01
static int tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString01(lua_State* tolua_S)
{
tolua_Error tolua_err;
if (
!tolua_isusertable(tolua_S,1,"cocos2d::CCLabelTTF",0,&tolua_err) ||
!tolua_isstring(tolua_S,2,0,&tolua_err) ||
!tolua_isstring(tolua_S,3,0,&tolua_err) ||
!tolua_isnumber(tolua_S,4,0,&tolua_err) ||
!tolua_isnoobj(tolua_S,5,&tolua_err)
)
goto tolua_lerror;
else
{
const char* label = ((const char*) tolua_tostring(tolua_S,2,0));
const char* fontName = ((const char*) tolua_tostring(tolua_S,3,0));
float fontSize = ((float) tolua_tonumber(tolua_S,4,0));
{
cocos2d::CCLabelTTF* tolua_ret = (cocos2d::CCLabelTTF*) cocos2d::CCLabelTTF::labelWithString(label,fontName,fontSize);
tolua_pushusertype(tolua_S,(void*)tolua_ret,"cocos2d::CCLabelTTF");
}
}
return 1;
tolua_lerror:
return tolua_Cocos2d_cocos2d_CCLabelTTF_labelWithString00(tolua_S);
}
#endif //#ifndef TOLUA_DISABLE
~~~
在這里看到此函數轉換過程,并可以很清楚看到:
~~~
cocos2d::CCLabelTTF* tolua_ret = (cocos2d::CCLabelTTF*) cocos2d::CCLabelTTF::labelWithString(label,fontName,fontSize);
~~~
到這里大家會很清楚需要的參數都是哪些,如果還不清楚,繼續按住Command然后點擊labelWithString進入cocos2dx引擎代碼?CCLabelTTF.cpp中的此函數實現啦!
可能這部分有童鞋看得比較迷茫 =。 = 那么Himi來簡化這些復雜來說:
解析lua腳本中的一句代碼->通過解析層代碼->將其轉換并轉到前端代碼進行使用
那么當然此過程也可逆:
前端代碼->通過解析層代碼->使用lua腳本中東東
這里由于Himi對cocos2dx 中的lua還沒有深入了解,所以不知是否過程可逆;
OK,基本就是這樣,對于腳本的熟悉,主要還是在公司進行使用然后慢慢熟悉和熟練掌握的,本章主要需要童鞋們記住的是腳本的概念和作用!
- 前言
- 【Iphone 游戲開發】游戲引擎剖析
- [Object-C語言隨筆之一]Mac os 下搭建iOS開發環境
- [Object-C語言隨筆之二] 《NSLog》常用的打印調試語句與自動排版
- [Object-C語言隨筆之三] 類的創建和實例化以及函數的添加和調用!
- [Object-C語言隨筆之四]創建視圖并繪制簡單圖形
- 【iOS-Cocos2d游戲開發之一】搭建cocos2d游戲引擎環境HelloWorld!
- 【iOS-Cocos2d游戲開發之二】Cocos2D 游戲開發資源貼(教程以及源碼)
- 【iOS-Cocos2d游戲開發之三】CCScene切換的所有特效(28種)以及設置屏幕橫豎屏!
- 【iOS-Cocos2d游戲開發之四】獨自收集Cocos2d提供的字體!共57種(有對照的字體圖)
- 【iOS-Cocos2d游戲開發之五】多觸點與觸屏事件詳解(單一監聽、事件分發)【11月28日更新】
- 【iOS-Cocos2d游戲開發之六】對觸屏事件追加講解,解決無法觸發ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戲開發之七】在cocos2d中添加/刪除系統組件,并解決View設置透明會影響View中的其他組件的問題!【11月28日更新解決添加組件Cocos2d動畫停止播放的BUG】
- 【iOS-Cocos2d游戲開發之八】開啟高清(960*640)模式問題與解答、圖片適配以及設置iphone橫豎屏
- 【iOS-Cocos2d游戲開發之九】講解CCSpriteBatchNode與TP工具的".pvr.ccz",".plist"共用的終極精靈優化及注意事項!
- 【iOS-Cocos2d游戲開發之十】添加粒子系統特效并解決粒子特效與Layer之間的坐標問題;
- 【iOS-Cocos2d游戲開發之十一】使用Box2d物理系統以及在cocos2d框架添加Box2d物理系統lib包的方法
- 【iOS-Cocos2d游戲開發之十二】淺析使用C++/C/OC進行iOS游戲混編出現“failed with exit”問題與小結;
- 【iOS-Cocos2d游戲開發之十三】CCSprite利用Bezier(貝塞爾)做拋物線動作并讓CCSprite同時播放兩個Action動作!
- 【iOS-Cocos2d游戲開發之十四】音頻/音效/視頻播放(利用Cocos2D-iPhone-Extensions嵌入Cocos2d進行視頻播放!)
- 【iOS-Cocos2d游戲開發之十五】詳解CCProgressTimer 進度條并修改cocos2d源碼實現“理想”游戲進度條!
- 【iOS-Cocos2d游戲開發之十六】添加本地通知(UILocalNotification)以及添加系統組件滾動視圖(UIScrollView)!【2011年11月15日更新】
- 【iOS-Cocos2d游戲開發之十七】靈活使用精靈可視區域(TextureRect)與錨點(anchorPoint),并結合可視區域與錨點制作進度條!
- 【iOS開發必備指南合集】申請企業級IDP、真機調試、游戲接入GameCenter 指南(實現仿官方的成就提示)、游戲接入OpenFeint指南;
- 【iOS-Cocos2d游戲開發之十八】解決滾屏背景/拼接地圖有黑邊(縫隙)/動畫播放出現毛邊以及禁止游戲中自動鎖屏問題!【2011年12月18日補充】
- 【iOS開發必收藏】詳解iOS應用程序內使用IAP/StoreKit付費、沙盒(SandBox)測試、創建測試賬號流程!【2012-12-11日更新獲取"產品付費數量等于0的問題"】
- 【iOS-cocos2d-X 游戲開發之一】在Mac下結合Xcode搭建Cocos2d-X開發環境!
- 【iOS-cocos2d-X 游戲開發之二】【必看篇】總結闡述Cocos2d-X與Cocos2d-iphone區別;
- 【iOS-Cocos2d游戲開發之十九】游戲數據存儲的四種常用方式NSKeyedArchiver/NSUserDefaults/Write寫入/SQLite3
- 【iOS-Cocos2d游戲開發之二十】精靈的基礎知識點總匯(位圖操作/貼圖更換/重排z軸等)以及利用CCSprite與CCLayerColor制作簡單遮蓋層!
- 【iOS-Cocos2d游戲開發之二十一 】自定義精靈類并為你的精靈設置攻擊幀(指定開始幀)以及擴展Cocos2d源碼的CCAnimation簡化動畫創建!
- 【iOS-Cocos2d游戲開發之二十二 】CCSpeed實現CCAnimate動畫進行時設置慢動作以及設置游戲加減速進行(塔防游戲必備)!
- 【iOS-cocos2d-X 游戲開發之三】Mac下配置Android NDK環境并搭建Cocos2d-x環境并Eclipse正常編譯運行Cocos2dX自帶TestsDemo項目!
- 【iOS-cocos2d-X 游戲開發之四】Cocos2dX創建Android NDK新項目并編譯導入Eclipse中正常運行!
- 【iOS-cocos2d-X 游戲開發之五】游戲存儲之Cocos2dX自帶CCUserDefault類詳解;
- 【iOS-cocos2d-X 游戲開發之六】使用Base64算法對Cocos2dX自帶CCUserDefault游戲存儲數據編碼!
- 【iOS-cocos2d-X 游戲開發之七】整合Cocos2dX的Android項目到Xcode項目中,Xcode編寫&編譯代碼,Android導入打包運行即可!
- 【iOS-iap防護】驗證用戶付費收據!拒絕iap Cracker!拒絕iap Free!讓iphone越獄用戶無從下手!【2012年5月2日更新防護iap Free的方法】
- 【COCOS2DX-LUA 腳本開發之一】在Cocos2dX游戲中使用Lua腳本進行游戲開發(基礎篇)并介紹腳本在游戲中詳細用途!
- 【iOS-cocos2d-X 游戲開發之九】Cocos2dx利用CCSAXParser解析xml數據&CCMutableDictionary使用與注意!
- 【iOS-cocos2d-X 游戲開發之十】自定義CCSprite/Layer/CCNode及靜態類模版&自定義類細節說明&Cocos2dx觸屏事件講解
- 【iOS-cocos2d-X 游戲開發之十一】New CCSprite()帶來的錯誤&使用CCUserDefault及pvr.ccz在Cocos2dx中要注意!
- 【iOS-cocos2d-X 游戲開發之十二】自定義Cocos2dx搖桿(增強Joystick),增加搖桿跟隨用戶觸點作為搖桿坐標,讓搖桿不再死板!
- 【iOS-cocos2d-X 游戲開發之十三】詳細講解在Xcode中利用預編譯并通過Jni調用Android的Java層代碼(cocos2dx里訪問調用Android函數)!
- 【iOS-cocos2d-X 游戲開發之十四】Xcode中c++&Object-C混編,詳細介紹如何在cocos2dx中訪問object函數以及Apple Api
- 【iOS-cocos2d-X 游戲開發之十五】Cocos2dx中響應Android的Back(返回)與Menu(小房子)事件&&Cocos2dx自動釋放粒子內存函數!
- 【iOS-cocos2d-X 游戲開發之十六】配置你的Cocos2dx項目編譯后的Android自動使用(-hd)高清圖&設置Android自適應屏幕、縮放比例方法!
- 【Cocoa(mac) Application 開發系列之四】動作編輯器(Cocos2dx)制作流程詳解及附上響應鼠標滾軸事件、反轉坐標系、導入/創建資源目錄等知識點代碼!
- 【Cocos2d-X(2.x) 游戲開發系列之一】cocos2dx(v2.x)與(v1.x)的一些常用函數區別講解!在2.x版CCFileData類被去除等
- 【Cocos2d-X(2.x) 游戲開發系列之二】cocos2dx最新2.0.1版本跨平臺整合NDK+Xcode,Xcode編寫&編譯代碼,Android導入打包運行即可!
- 【Cocos2dX(2.x)_Lua開發之三】★重要必看篇★在Lua中使用自定義精靈(Lua腳本與自創建類之間的訪問)及Lua基礎講解
- 【Cocos2d-X(2.x) 游戲開發系列之三】最新版本cocos2d­2.0­x­2.0.2使用新資源加載策略!不再沿用-hd、-ipad、-ipadhd添加后綴方式
- 【Cocos2d-X(1.x 2.x) 修復篇】iOS6 中 libcurl.a 無法通過armv7s編譯以及iOS6中無法正常游戲橫屏的解決方法
- 【Cocos2d-X(1.x 2.x) 】iOS6與iphone5適相關設置隨筆(解決第三方類庫無法通過armv7s編譯的方法、添加Default-568h@2x.png)