《Cocos2d-x-3.2 Lua-tests》文件詳解 之 加速器


現在主流的移動游戲開發方法是cocos2d-x + Lua腳本語言做快速開發。經歷了幾個小游戲的開發過程,體味到了cocos2d-x 和 Lua的強大之處。

但是有些東西掌握地不牢,用的時候不免會捉襟見肘。網上提供的資料也是零零散散的,有時候看起來然人一頭霧水。

所以決定將對Lua-tests進行解讀,記錄下來,形成一套完整的Lua + cocos2d-x教程。一來溫故知新,二來與大家交流,共同進步。

接下來的博文中,如有錯誤的地方,還需要大家不吝指正!

本博文對應的引擎版本和工具:

  • cocos2d-x-3.2 (不要3.0與3.2混用,誰用誰懂的。。。)
  • Cocos Code IDE Build:V1.0.0.RC0
  • Visual Studio 2012 - 用來創建自定義runtime
  • 環境配置如圖,windows環境變量的設置從略

順便提一句,在網上很少能找到專門介紹 cocos2d-x + Lua的文章,本系列博客將只介紹Lua版本。C++先放一邊,還有,現在的Cocos Code IDE已經能夠將你的項目刷到真機上測試了!!

以下步驟可以在Cocos Code IDE中運行Lua-test,並Package to APK 裝到真機上測試:

  1. 進入Cocos Code IDE,在項目管理其空白處右擊,選擇Cocos Lua Project創建新項目。
  2. 輸入一個你想要的非 nil名字,點擊下一步,勾選Add Native Codes,點擊Finish,IDE會用內置的項目模板給你生成原始項目
  3. 此時打開你的workspace,找到你的項目,會有這幾個文件夾:.settings , frameworks,res,runtime,src。
  4. 接下來:刪除src,res文件夾下的所有文件
  5. 找到你的cocos2d-x-3.2,一次進入test→lua-tests。里面有project,res,src三個文件夾,30個.lua文件,一個.cocos-project.json文件
  6. 現在,將30個.lua文件復制到你項目的 根文件夾下,然后將res,src中的文件都復制到你項目對應的文件夾中
  7. 進到你項目src文件夾,里面有48個Test文件夾和這幾個.lua文件:controller.lua  ,helper.lua  ,mainMenu.lua ,testResource.lua ,VisibelRect.lua。將controlle.lua重命名為main.lua
  8. 回到Cocos Code IDE,刷新項目,就能在項目目錄中看到上面提到的所有文件了。然后,選中項目,右鍵 → Run As → Cocos Luabinding運行

 

到這一步,已經在PC上面完成。

下面上圖,刷到真機上:

最后一步,連接你的設備到電腦,點擊Refresh,找到你設備之后,Refresh會變成Install,點擊即可

還可以點擊Open Package Location好到你的apk文件。

刷到你的手機里面,隨時感受Cocos2d-x的魅力吧。

 

下面是本文“主題” - 加速器

在Cocos Code IDE一次找到src → AccelerometerTest - 打開AccelerometerTest.lua 就會見到下面的代碼

(看懂代碼的前提:掌握Lua語法 + 了解Cocos2d-x基本框架)

--[[
         每一個test文件是一個Scene,該Scene中包含多個小test,每個test是一個層,主框架是一個Layer,包含主界面菜單,封裝了所有Scene都用得到的基本功能
]]--

local function AccelerometerMainLayer()

    local function title()
      return "AccelerometerTest"
    end
    local layer = cc.Layer:create()

    local function onEnter()
        --首先設置layer的可加速屬性為true,對layer啟用加速器
        layer:setAccelerometerEnabled(true)
     --[[
      這個是設置測試的標題:ttf字體標簽,
      顯示內容:title()方法返回的字符串,
      字體文件:fonts/arial.ttf
      字體大小:32
      添加到層中,設置錨點和坐標
      ]]--
local label = cc.Label:createWithTTF(title(), "fonts/arial.ttf", 32) layer:addChild(label, 1) label:setAnchorPoint(cc.p(0.5, 0.5)) label:setPosition( cc.p(VisibleRect:center().x, VisibleRect:top().y - 50) ) --生成小球 - Sprite local ball = cc.Sprite:create("Images/ball.png") --設置初始位置 ball:setPosition(cc.p(VisibleRect:center().x, VisibleRect:center().y)) layer:addChild(ball) local function accelerometerListener(event,x,y,z,timestamp) --[[ 加速事件發生時,會傳出多個參數:event,x,y,z,timestamp event:被綁定的物件發出的加速器事件,可以用getCurrentTarget()獲取事件的發送者 x,y,z:加速器傳遞的的坐標 ]]-- --獲取ball local target = event:getCurrentTarget() --獲取尺寸 local ballSize = target:getContentSize() --獲取小球初始坐標,存入ptNowX,ptNowY中,並配合加速器傳來的坐標x,y進行一系列計算 local ptNowX,ptNowY = target:getPosition() ptNowX = ptNowX + x * 9.81 ptNowY = ptNowY + y * 9.81 --設置小球活動的時候x坐標的范圍 local minX = math.floor(VisibleRect:left().x + ballSize.width / 2.0) local maxX = math.floor(VisibleRect:right().x - ballSize.width / 2.0) --進行簡單的碰撞判定 if ptNowX < minX then ptNowX = minX elseif ptNowX > maxX then ptNowX = maxX end --設置小球活動的時候y坐標的范圍 local minY = math.floor(VisibleRect:bottom().y + ballSize.height / 2.0) local maxY = math.floor(VisibleRect:top().y - ballSize.height / 2.0) if ptNowY < minY then ptNowY = minY elseif ptNowY > maxY then ptNowY = maxY end --將計算后的ptNowX,ptNowY設置給小球 因為ptNowX,ptNowY與加速器坐標x,y相關,是動態的,所以小球會隨加速器動起來 target:setPosition(cc.p(ptNowX , ptNowY)) end --onEnter()方法入口,注冊加速事件偵聽器,accelerometerListener()方法定義了事件發生時觸發的相關操作(邏輯,動作。。) local listerner = cc.EventListenerAcceleration:create(accelerometerListener) --與ball的事件調度器綁定 --不了解cocos2d-x事件調度機制的人,留言交流 layer:getEventDispatcher():addEventListenerWithSceneGraphPriority(listerner,ball) end local function onExit() layer:setAccelerometerEnabled(false) end --載入節點的時候,引擎自動調用onEnter(),開始布局和啟用加速器 --退出的時候,調用onExit(),關閉加速器(僅對本層 關閉 local function onNodeEvent(event) if "enter" == event then onEnter() elseif "exit" == event then onExit() end end --首先給layer注冊節點事件,這里是讀代碼的入口 layer:registerScriptHandler(onNodeEvent) return layer end function AccelerometerMain() cclog("AccelerometerMain") local scene = cc.Scene:create() scene:addChild(AccelerometerMainLayer()) scene:addChild(CreateBackMenuItem()) return scene end

注:測試工程的架構不值得大家學習,所以就不做介紹了。

程序猿提高的方法一是保持學習,二是跟保持學習的人交流。

看到太多太多的程序員上網發帖,開口就跪求。。。大量的時間浪費在質量不高的學習資料中,真讓人心酸呀。。。

好的程序員是高智慧人群,學習是有方法的。大家共勉

 

ps:原創,轉載請著名出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM