一年之前學的cocos2dx,那時候還是用C++編寫的,但學完之後就找的一個新的方向——Unity3D開發的崗位,對我而言是一個新的方向,那時候經過了幾個月的每天熬夜奮戰,從”0“基礎到最後項目開發,那時候是在的是個小公司,總體而言還算比較輕鬆,可能效率利用的比較低,現在剛出來了,來到一家大公司,感覺到很多不一樣的變化,方向又改變了,還是回到之前的cocos2dx開發,但用的不是C++,而是lua腳本語言來開發,對我而言又是一個新的方向,既來之則安之,在接觸了那麼多方向之後,是該選擇一個確定的研究方向深入下去。來這該公司一週了,感受到一種之前所沒有的緊迫感,每天要給自己下定任務,並且按時按量的去完成,同事都很厲害,都是在這行業工作了多少年的,很有工作經驗,希望以後像他們多多請教,公司好多女程序,都很厲害,我的直屬上司楊總就是當時面試我的,我以爲當時面試的時候他旁邊的那位是祕書的,挺漂亮的一個女”上司“,我一直以爲是祕書,看起來很年輕,後來從同事那兒瞭解到她是我們所有人的上司,是公司的技術總監,好吧,我驚訝了,原來她是公司元老級別的程序了。第一天入職,辦理好入職手續,下午的時候老大遞給了我一般Lua編程的教程,不是太厚,但也不薄,三百多頁吧。後來花了兩天左右的時間將它看完,由於之前學的語言都是編譯型語言,用上強大的Visutial studio+VA提示功能非常強大,導致現在要用文本編輯器來寫lua語言有點痛苦,很容易手誤,但還是要慢慢習慣,任何事物都有兩面性,沒有所謂絕對的完美。
花兩天時間看完lua語法,然後花了一天看了下cocos2dx lua的Demo,接下來就可以進行項目開發了,不然每天開例會總是處於學習階段總感覺不好,公司不會養兩種人,懶人和閒人,所以還是多花點業餘時間來彌補自己的缺陷,跟上大部隊的開發。
創建Cocos2dx-Lua項目
我這裏使用的是Visual Studio 2012+cocos2dx 2.2.4,前提安裝上Python
打開控制檯,通過命令來創建新的項目
然後打開cocos2dx的projects目錄發現生成了剛剛創建的lua項目
如果是Windows平臺就打開proj.win32->luastudy1.sln,編譯一下即可運行勢力demo。
效果圖
cocos2dx lua項目,lua腳本放在Resources目錄下,也就是說lua腳本也像圖片,聲音資源這些一樣被當成是資源利用了,所以如果程序要邏輯跟新或者說有什麼bug,可以直接修改lua文件然後重新上傳即可,不需要再次編譯發佈,這也是lua開發cocos2dx的一大優點。
require "AudioEngine"
-- for CCLuaEngine traceback
function __G__TRACKBACK__(msg)
print("----------------------------------------")
print("LUA ERROR: " .. tostring(msg) .. "\n")
print(debug.traceback())
print("----------------------------------------")
end
--打印函數
local cclog = function(...)
print(string.format(...))
end
function main()
--調用其他腳本的方法
require "hello2"
--調用其他lua的腳本中的方法
cclog("調用hello2腳本的方法:Result = "..myadd(3,5))
--獲取屏幕分辨率
local visibleSize = CCDirector:sharedDirector():getVisibleSize()
--獲取屏幕分辨率的起始座標
local origin = CCDirector:sharedDirector():getVisibleOrigin()
print("可視區域的起點座標:",origin.x,origin.y)
print("屏幕分辨率:",visibleSize.width,visibleSize.height)
--創建一個場景
local scene = CCScene:create()
--創建一個層
local layer = CCLayer:create()
--創建一個文本
local label = CCLabelTTF:create("你好 Lua","simkai",50) --如果中文不顯示的話,必須要將lua文件保存爲中文
label:setPosition(ccp(visibleSize.width/2+30,visibleSize.height/2+100))
layer:addChild(label)
--創建一個Sprite圖標
local iconSprite = CCSprite:create("Icon.png")
iconSprite:setPosition(ccp(80,260))
layer:addChild(iconSprite)
----------------------------創建一個動畫精靈---------------------------------------------------
local function createDog()
--創建一個動畫(這裏是兩張圖片合成的一張,所以要根據矩形分割)
local frameWidth = 105
local frameHeight = 95
--紋理塊管理器創建一個圖片文理
local textureDog = CCTextureCache:sharedTextureCache():addImage("dog.png")
local rect = CCRectMake(0,0,frameWidth,frameHeight)
--創建精靈幀
local frame0 = CCSpriteFrame:createWithTexture(textureDog,rect)
rect = CCRectMake(frameWidth,0,frameWidth,frameHeight)
local frame1 = CCSpriteFrame:createWithTexture(textureDog,rect)
--創建一個精靈
local spriteDog = CCSprite:createWithSpriteFrame(frame0)
spriteDog.isPaused = false
spriteDog:setPosition(origin.x+visibleSize.width-60,origin.y + visibleSize.height/2)
local animFrames = CCArray:create()
animFrames:addObject(frame0)
animFrames:addObject(frame1)
--由容器類實例對象創建一個動畫幀對象,設定每0.4秒更新一幀
local animation = CCAnimation:createWithSpriteFrames(animFrames,0.4) --第二個參數是播放的速率,值越小播放越快
--創建一個動畫
local animate = CCAnimate:create(animation)
--設置精靈循環播放這個動作
spriteDog:runAction(CCRepeatForever:create(animate))
--設置精靈顏色
--spriteDog:setColor(ccc3(0,255,0))
--自定義一個定時器
local function tick()
if spriteDog.isPaused then return end
local x,y = spriteDog:getPosition() --獲取座標
if x<origin.x+60 then
x = origin.x+visibleSize.width-60
else
x = x - 1
end
spriteDog:setPositionX(x)
end
--啓動定時器
CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(tick,0,false)
return spriteDog
end
---------------------------------創建一個可移動的背景層-----------------------------------------
local function createMoveLayer()
local layerFarm = CCLayer:create()
--添加背景
local bg = CCSprite:create("farm.jpg")
bg:setPosition(origin.x+visibleSize.width/2+80,origin.y+visibleSize.height/2 -20)
layerFarm:addChild(bg)
--添加地面田地
for i = 0,3 do
for j = 0,1 do
local spriteLand = CCSprite:create("land.png")
spriteLand:setPosition(200+j*180 - i%2 *90 ,10 + i*95/2)
layerFarm:addChild(spriteLand)
end
end
--添加植物(一個4*1的圖片)
local frameCrop = CCSpriteFrame:create("crop.png",CCRectMake(0,0,105,95))
for i = 0,3 do
for j = 0,1 do
local spriteCrop = CCSprite:createWithSpriteFrame(frameCrop)
spriteCrop:setPosition(10+200+j*180 - i%2*90,30+10+i*95/2)
layerFarm:addChild(spriteCrop)
end
end
--------------------觸摸事件-------------------------------------------
local touchBeginPoint = nil
--開始觸摸
local function onTouchBegan(x,y)
cclog("onTouchBegin:%0.2f,%0.2f",x,y)
touchBeginPoint = {x = x,y = y}
return true
end
--觸摸移動
local function onTouchMoved(x,y)
cclog("onTouchMoved:%0.2f,%0.2f",x,y)
if touchBeginPoint then
local cx,cy = layerFarm:getPosition()
layerFarm:setPosition(cx+x-touchBeginPoint.x,cy+y-touchBeginPoint.y)
touchBeginPoint = {x = x,y = y}
end
end
--結束觸摸
local function onTouchEnded(x,y)
cclog("onTouchEnded:%0.2f,%0.2f",x,y)
touchBeginPoint = nil
end
--判斷觸摸動作
local function onTouch(eventType,x,y)
if eventType == "began" then
return onTouchBegan(x,y)
elseif eventType == "moved" then
return onTouchMoved(x,y)
else
return onTouchEnded(x,y)
end
end
--調用layerFarm的registerScriptTouchHnadler函數註冊按下的事件相應函數
layerFarm:registerScriptTouchHandler(onTouch)
--使layerFarm能夠相應屏幕按下的事件
layerFarm:setTouchEnabled(true)
return layerFarm
end
--------------------------創建菜單-----------------------------------------------------
local function createLayerMenu()
local layerMenu = CCLayer:create()
local menuPopup,menuTools,effectID --菜單欄、左下角的工具欄按鈕、音效ID
--關閉菜單欄
local function menuCallBackClosePopup()
AudioEngine.stopEffect(effectID) --根據ID號來關閉這個聲音
menuPopup:setVisible(false)
end
--開啓菜單欄
local function menuCallBackOpenPopup()
local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")
effectID = AudioEngine.playEffect(effectPath) --播放一個聲音然後賦值給某個ID
menuPopup:setVisible(true)
end
--添加一個選擇菜單
local menuPopupItem = CCMenuItemImage:create("menu2.png","menu2.png") -- 菜單選項
menuPopupItem:setPosition(0,0)--選項卡的位置
menuPopupItem:registerScriptTapHandler(menuCallBackClosePopup) --點擊事件
menuPopup = CCMenu:createWithItem(menuPopupItem) --根據菜單選項創建菜單
menuPopup:setPosition(origin.x+visibleSize.width/2,origin.y+visibleSize.height/2) --設置菜單的位置
menuPopup:setVisible(false) --設置面板的不顯示
layerMenu:addChild(menuPopup) --將菜單添加到菜單層中
--添加左下角的工具圖標
local menuToolsItem = CCMenuItemImage:create("menu1.png","menu1.png")
menuToolsItem:setPosition(0,0)
menuToolsItem:registerScriptTapHandler(menuCallBackOpenPopup)
menuTools = CCMenu:createWithItem(menuToolsItem)
local itemWidth = menuToolsItem:getContentSize().width --獲取圖片的寬
local itemHeight = menuToolsItem:getContentSize().height --獲取圖片的高
menuTools:setPosition(origin.x + itemWidth/2,origin.y + itemHeight/2) --設置位置
layerMenu:addChild(menuTools)
return layerMenu
end
---------------------------添加背景音樂-----------------------------------------------
--循環播放背景音樂
--SimpleAudioEngine:sharedEngine():playBackgroundMusic("background.mp3",true)
--或者
local bgMusicPath = CCFileUtils:sharedFileUtils():fullPathForFilename("background.mp3")
AudioEngine.playMusic(bgMusicPath,true)
-- 取得聲音引擎的實例對象並調用其preloadEffect函數將聲音文件“effect1.wav”預加載進內存。這裏並不播放,預加載是爲了在播放時不造成卡頓感。
--SimpleAudioEngine:sharedEngine():preloadEffect("effect1.wav");
--或者
local effectPath = CCFileUtils:sharedFileUtils():fullPathForFilename("effect1.wav")
AudioEngine.preloadEffect(effectPath)
--添加動畫狗
layer:addChild(createDog(),4) --第二個參數是Z(深度),值越大越在前面
--添加可移動的背景層到主場景中
scene:addChild(createMoveLayer())
--添加menu菜單
scene:addChild(createLayerMenu())
--添加自己繪製的圖標和文字層
scene:addChild(layer)
--運行場景
CCDirector:sharedDirector():runWithScene(scene)
end
--腳本的入口函數,前面一個參數是調用執行的函數,後面一個是錯誤處理的函數
xpcall(main, __G__TRACKBACK__)
注意:如果要顯示中文,解決方案將lua文件保存爲utf8格式
本文出自 “丁小未的專欄” 博客,請務必保留此出處http://dingxiaowei.blog.51cto.com/4561335/1437085