1. 程式人生 > >quick-cocos2d-x 學習系列之十四 測試用例

quick-cocos2d-x 學習系列之十四 測試用例

quick-cocos2d-x 學習系列之十四 測試用例

        

         定義變數,建立13個場景名字

    local items = {

        "framework.helper",

        "framework.native"

,

        "framework.display",

        "framework.crypto",

        "framework.network",

        "framework.luabinding",

        "framework.event"

,

        "framework.interface",

        "framework.socketTcp",

        "framework.timer",

        "framework.gamestate",

        "framework.transition"

,

        "framework.nvgdrawnode"

}

game.createMenu函式用於建立一個UIListView,並向其中新增所有menu (每個menu的回撥都為opentest).

在滑動UIListView的時設定變數game.bListViewMove = true(停止滑動時重新設定為false), 該值為true時,menu不呼叫。

game.createSceneClass(name) 用於建立一個class類。

每個類建立兩個函式prepare,runTest。

其中prepare函式建立一個Layer,設定觸控,建立一個RETURN按鈕點選返回到mainscene,建立一個label顯示標題。如果有引數則顯示另一個label.

其中runtest函式呼叫和自己Memu名字同名且多了一個Test單詞的函式。

 

1.  framework.helper

呼叫game.createMenu函式增加menu.(這也是為什麼該函式放在game.lua檔案上的原因了)回撥函式為runtest函式。該函式所有場景類均一致。

該例載入config.lua 檔案。

 

2.  framework.native

包含7個items,

local items = {

        "activityIndicator",

        "showAlert",

        "openWebBrowser",

        "callme",

        "sendEmail",

        "getInputText",

        "vibrate",

    }

2.1         activityIndicator

顯示顯示活動指示器,2秒後呼叫函式隱藏顯示活動指示器,並停止呼叫函式。

 

2.2         showAlert

程式碼如下:

local function onButtonClicked(event)

        if event.buttonIndex == 1 then

            print("玩家選擇了 YES 按鈕")

        else

            print("玩家選擇了 NO 按鈕")

        end

    end

 

    device.showAlert("Confirm Exit", "Are you sure exit game ?", {"YES", "NO"}, onButtonClicked)

 

顯示一個對話方塊。

 

2.3         openWebBrowser

開啟瀏覽器如下圖:

device.openURL("http://dualface.github.com")

 

 

2.4         callme

通過如下函式撥打電話:

device.openURL("tel:123-456-7890")

 

 

2.5         sendEmail

通過如下程式碼,開啟裝置上的郵件程式,並建立新郵件,填入收件人地址

  local subject = string.urlencode("Hello")

  local body = string.urlencode("How are you ?")

    device.openURL(string.format("mailto:[email protected]?subject=%s&body=%s", subject, body))

 

 

 

 

2.6         getInputText

獲取輸入資訊

cc.Native:getInputText("Information","How weight are you (KG)", "60")

2.7         Vibrate

Vibrate 呼叫函式cc.Native:vibrate()實現振動。

 

3.  framework.display

local items = {

        "addImageAsync",

        "scale9Sprite",

        "tilesSprite",

        "tiledBatchNode",

        "drawNode",

        "progress",

        "layerMultiTouch"

    }

 

3.1         addImageAsync

 

非同步載入圖片

display.addImageAsync("Coin0001.png", function(event, texture)

        printf("display.addImageAsync(\"Coin0001.png\") - event = %s,texture = %s", tostring(event), tostring(texture))

        self.coin = display.newSprite("Coin0001.png", display.left + 100, display.cy)

        self:addChild(self.coin)

    end)

載入完畢後呼叫函式,顯示圖片到場景中。

3.2         scale9Sprite

通過命令newScale9Sprite,建立圖片GreenButton.png建立精靈

設定精靈範圍最後設定fadeout和fadein.

 

3.3         tilesSprite

通過如下命令建立一個圖片組成的tilesprite,密集恐懼症的小朋友要慎入。   

self.tilesSprite_ = display.newTilesSprite("close.png", cc.rect(10, 10, 100, 100))

        :pos(display.left + 10, display.bottom+ 10)

        :addTo(self)

 

 

3.4         tiledBatchNode

程式碼如下:

local cb = function(plist, image)

        self.tiledBatchNode_ = display.newTiledBatchNode("#blocks9.png", "blocks9ss.png", cc.size(170, 170), 10, 10)

            :pos(display.left + 10, display.bottom+ 150)

            :addTo(self)

    end

display.addSpriteFrames("blocks9ss.plist", "blocks9ss.png", cb)

載入圖片到幀,然後呼叫函式cb.

其中函式display.addSpriteFrames()

display.addSpriteFrames(plistFilename, image, handler)

將指定的 Sprite Sheets 材質檔案及其資料檔案載入影象幀快取。

格式:

display.addSpriteFrames(資料檔名, 材質檔名)

1

2

3

4

5

6

7

8

<br>-- 同步載入紋理

display.addSpriteFrames("Sprites.plist", "Sprites.png")

 

-- 非同步載入紋理

local cb = function(plist, image)

    -- do something

end

display.addSpriteFrames("Sprites.plist", "Sprites.png", cb)

Sprite Sheets 通俗一點解釋就是包含多張圖片的集合。Sprite Sheets 材質檔案由多張圖片組成,而資料檔案則記錄了圖片在材質檔案中的位置等資訊。

Parameters

·        string plistFilename 資料檔名

·        string image 材質檔名

3.5         drawNode

初始化了一個node節點,進行畫圖。

一個實心圓,一個空心圓,一個方形,一個直線,一個三角型。

3.6         progress

建立一個原型的進度條

    local progress = display.newProgressTimer("Coin0001.png", display.PROGRESS_TIMER_RADIAL)

        :pos(100, 100)

        :addTo(self)

    progress:setPercentage(60)

    self.progressNode_ = progress

 

 

3.7         layerMultiTouch

建立一個新的Layer.為其增加監聽,回撥函式為onTouch函式。

onTouch函式實現多點觸控。

4.  framework.crypto

local items = {

        "AES256",

        "XXTEA",

        "Base64",

        "MD5File",

        "MD5",

    }

 

4.1         AES256

進行AES256加密解密操作。

 

 

4.2         XXTEA

XXTEA加密,如下程式碼:

local p = "Test123"

    local k = "KEYKEY"

    local c = crypto.encryptXXTEA(p, k)

    printf("source: %s", p)

    printf("encrypt XXTEA: %s", bin2hex(c))

    printf("decrypt XXTEA: %s", crypto.decryptXXTEA(c, k))

 

    local p = string.rep("HELLO", 15)

    local k = "keykey"

    local c = crypto.encryptXXTEA(p, k)

    printf("source: %s", p)

    printf("encrypt XXTEA: %s", bin2hex(c))

    printf("decrypt XXTEA: %s", crypto.decryptXXTEA(c, k))

 

4.3         Base64

Base64加密解密操作。同XXTEA

 

4.4         MD5File

MD5演算法,對檔案進行md5計算,程式碼如下

local file = cc.FileUtils:getInstance():fullPathForFilename("config.lua")

    printf("md5 file test: %s -> %s", file, crypto.md5file(file))

 

4.5         MD5

對字串進行MD5計算,如下程式碼:

local p = string.rep("HELLO", 5)

    printf("md5Test: %s -> %s", p, crypto.md5(p))

5.  framework.network

local items = {

        "createHTTPRequest",

        "createHTTPRequestBadDomain",

        "send data to server",

        "isLocalWiFiAvailable",

        "isInternetConnectionAvailable",

        "isHostNameReachable",

        "getInternetConnectionStatus",

}

其中onResponse函式處理HTTP相關事件。

如果事件不是progress則報錯,如果是competeled則獲取資料長度,如果dumpResponse為true則列印String。

其他則列印”----------------------------------”。

 

5.1         createHTTPRequest

 

local url = "http://quick-x.com/feed/"

    self.requestCount = self.requestCount + 1

    local index = self.requestCount

    local request = network.createHTTPRequest(function(event)

        if tolua.isnull(self) then

            printf("REQUEST %d COMPLETED, BUT SCENE HAS QUIT", index)

            return

        end

        self:onResponse(event, index)

    end, url, "GET")

    printf("REQUEST START %d", index)

    request:start()

 

見14.3中對createHTTPRequest函式的解釋

 

5.2         createHTTPRequestBadDomain

程式碼同上,只是連線到一個不存在的HTTP地址上去。

 

5.3         senddata to server

通過POST命令,傳送資料到SERVER。

5.4         isLocalWiFiAvailable

判斷本地WIFI是否可用。

5.5         isInternetConnectionAvailable

判斷網連線是否可用。

5.6         isHostNameReachable

判斷一個網址是否可達

5.7         getInternetConnectionStatus

通過network.getInternetConnectionStatus()命令,判斷網際網路、WIFI、3G網路是否可用。

 

 

 

6.  framework.luabinding

    local items = {

        "avoidPeertableGC",

        "getCppFunction",

    }

 

6.1         avoidPeertableGC

local node = display.newNode()

    node:addNodeEventListener(cc.NODE_EVENT, function(event)

        printf("node event %s", event.name)

    end)

    node.customVar = 1

    node:setTag(1)

    self:addChild(node)

 

    printf("1. node.customVar = %s, expected = 1", tostring(node.customVar)) -- 1

    collectgarbage()

    collectgarbage()

    printf("2. node.customVar = %s, expected = 1", tostring(node.customVar)) -- 1

 

    self:performWithDelay(function()

        printf("3. node.customVar = %s, expected = 1", tostring(self:getChildByTag(1).customVar)) -- 1

        local node2 = self:getChildByTag(1)

        collectgarbage()

        collectgarbage()

        printf("4. node.customVar = %s, expected = 1", tostring(node2.customVar)) -- 1

        self:removeChildByTag(1)

        printf("5. node = %s, expected = nil", tostring(self:getChildByTag(1))) -- nil

        printf("6. node.customVar = %s, expected = nil", tostring(node2.customVar)) -- nil

    end, 1.0)

 

6.2         getCppFunction

-- override C++ class method

    function cc.Node:setPosition(x, y)

        printf("cc.Node:setPosition(%0.2f, %0.2f)", x, y)

        -- call origin C++ method

        local cfunction = tolua.getcfunction(cc.Node, "setPosition")

        cfunction(self, x, y)

    end

 

    local node = display.newNode()

    self:addChild(node)

    print("expected 'cc.Node:setPosition(100.00, 100.00)'")

    node:setPosition(100, 100) --cc.Node:setPosition(100.00, 100.00)

    local x, y = node:getPosition()

    printf("x, y = %0.2f, %0.2f, expected 100.00, 100.00", x, y)

 

    -- restoreC++ method

    cc.Node.setPosition = tolua.getcfunction(cc.Node,"setPosition")

    print("expected - no output")

node:setPosition(100, 100)

 

重寫C++類函式,並重新載入函式。

 

7.  framework.event

local items = {

        "addEventListener",

        "removeEventListener",

        "removeAllListener",

        "removeCoin",

        "sendEvent"

    }

先進行初始化,建立node增加圖片Coin0001.png.

增加事件監聽 EventTest1EventTest2

 

7.1         addEventListener

 

為代理事件增加事件監聽 EventTest3EventTest4

    self.eventProxy:addEventListener("EventTest3", function(event) print("event listener 3") dump(event) end, "tag3")

self.eventProxy:addEventListener("EventTest4", function(event) print("event listener 4") dump(event) end)

 

7.2         removeEventListener

移除事件EventTest1, EventTest2,EventTest3.

通過三種不同的方法如下:

    self.eventProxy:removeEventListener(self.eventHandle2)

    local eventHandle1 = self.eventProxy:getEventHandle("EventTest1")

    self.eventProxy:removeEventListener(eventHandle1)

    self.eventProxy:removeAllEventListenersForEvent("EventTest3")

 

7.3         removeAllListener

移除所有監聽程式。

7.4         removeCoin

移除coin精靈,當coin移除的時候新增的事件監聽程式也消失。

 

7.5         sendEvent

分發EventTest事件。

事件名字EventTest1,EventTest2,EventTest3,EventTest4.

 

8.  framework.interface

    local items = {

        "register",

        "modebase",

        "functions"

}

主要是3個常用介面。

 

8.1         Register

local register =require("framework.cc.Registry")

 

local eventProtocol =register.newObject("components.behavior.EventProtocol")

--建立一個事件協議物件。

register.setObject(eventProtocol, "cryptoTest1")

    if not register.isObjectExists("cryptoTest1") then

       printError("ERRORsome thing wrong please check Register")

    end

    register.getObject("cryptoTest1")

    register.removeObject("cryptoTest1")

    if register.isObjectExists("cryptoTest1") then

       printError("ERRORsome thing wrong please check Register")

    end

 

    if not register.exists("components.behavior.EventProtocol") then

       printError("ERRORsome thing wrong please check Register")

    end

 

 

 

8.2         Modebase

local mvcBase =require("framework.cc.mvc.ModelBase")

 

8.3         functions

建立兩個類Animal,Duck.

Iskindof函式用於判斷物件是否屬於指定的類。

呼叫math相關函式等LUA相關的函式。

 

 

 

 

 

 

 

 

 

9.  framework.socketTcp

    local items = {

        "Connect",

        "SendData",

        "Close"

}

Init函式建立一個SocketTCP物件。並新增SocketTCP相關的事件

EVENT_DATA

EVENT_CLOSE

EVENT_CLOSED

EVENT_CONNECTED

EVENT_CONNECT_FAILURE

 

9.1         Connect

連結127.0.0.1。

9.2         SendData

Socket傳送資訊。

9.3         Close

關閉Socket 物件。

 

10.        framework.timer

建立一個定時器

if self.timer_ then

        return

    end

 

    local Timer = require("framework.cc.utils.Timer")

    local appTimer = Timer.new()

 

    -- 響應 CITYHALL_UPGRADE_TIMER 事件

    local function onCityHallUpgradeTimer(event)

        if event.countdown > 0 then

            -- 倒計時還未結束,更新使用者介面上顯示的時間

            print("timer counting")

        else

            -- 倒計時已經結束,更新使用者介面顯示升級後的城防大廳

            print("timer over")

        end

    end

 

    -- 註冊事件

    appTimer:addEventListener("CITYHALL_UPGRADE_TIMER", onCityHallUpgradeTimer)

    -- 城防大廳升級需要 3600 秒,每 30 秒更新一次介面顯示

    appTimer:addCountdown("CITYHALL_UPGRADE_TIMER", 600, 10)

 

    appTimer:start()

 

    self.timer_ = appTimer

 

addCountdown命令

 

11.        framework.gamestate

初始化函式如下:

    local stateListener = function(event)

       if event.errorCode then

           print("ERROR,load:" .. event.errorCode)

           return

       end

 

       if "load" == event.name then

           local str = crypto.decryptXXTEA(event.values.data, "scertKey")

            local gameData = json.decode(str)

            dump(gameData, "gameData:")

       elseif "save" == event.name then

           local str = json.encode(event.values)

            if str then

                str = crypto.encryptXXTEA(str, "scertKey")

                returnValue = {data = str}

            else

              print("ERROR, encode fail")

                return

            end

 

           return {data = str}

       end

    end

 

    gameState.init(stateListener, "gameState.dat", "keyHTL")

 

儲存遊戲狀態之用。

分別呼叫gameState.load()和gameState.save(data)函式。

 

12.        framework.transition

建立10個金幣,分別執行不同的動作。

建立兩個grossini_blue_,一個執行動作一次,另一個永久執行。

13.        framework.nvgdrawnode

--nvgdraw繪畫函式

local quarLB = cc.p(display.cx/2, display.cy/2)

    local quarRT = cc.p(display.width - quarLB.x, display.height- quarLB.y)

 

    local drawNode1 = cc.NVGDrawNode:create()

    self:addChild(drawNode1)

    drawNode1:drawPoint(cc.p(display.cx - 100, display.cy), cc.c4f(1, 0, 0, 1))

 

    local points = {}

    for i=1,10 do

       points[i] = cc.p(display.width/10*i, 10)

    end

    local drawNode2 = cc.NVGDrawNode:create():addTo(self)

    drawNode2:drawPoints(points, 10, cc.c4f(0, 1, 0, 1))

 

    local drawNode3 = cc.NVGDrawNode:create()

    self:addChild(drawNode3)

    drawNode3:drawLine(quarLB, quarRT, cc.c4f(0, 0, 1, 1))

   

    local drawNode4 = cc.NVGDrawNode:create()

    self:addChild(drawNode4)

    drawNode4:drawRect(quarLB, quarRT, cc.c4f(1, 1, 0, 1))

 

    points = {}

    points[1] = cc.p(100, 200)

    points[2] = cc.p(100, 100)

    points[3] = cc.p(200, 100)

    points[4] = cc.p(300, 150)

    local drawNode5 = cc.NVGDrawNode:create()

    self:addChild(drawNode5)

    drawNode5:drawPolygon(points, 4, true, cc.c4f(0, 1, 1, 1))

   

    local drawNode6 = cc.NVGDrawNode:create()

    self:addChild(drawNode6)

    drawNode6:drawCircle(cc.p(display.cx, display.cy), 20, cc.c4f(1, 0, 1, 1))

 

    local drawNode7 = cc.NVGDrawNode:create()

    self:addChild(drawNode7)

    drawNode7:drawQuadBezier(quarLB, cc.p(quarRT.x, quarLB.y), quarRT, cc.c4f(1, 1, 1,1))

 

    local drawNode8 = cc.NVGDrawNode:create()

    self:addChild(drawNode8)

    drawNode8:drawCubicBezier(cc.p(300, 400), cc.p(350, 500), cc.p(500, 300), cc.p(600, 400), cc.c4f(0.5, 0, 0, 1))

   

    local drawNode9 = cc.NVGDrawNode:create()

    self:addChild(drawNode9)

    drawNode9:drawDot(cc.p(display.cx, display.cy),5, cc.c4f(0, 0.5, 0, 1))

   

    local drawNode10 = cc.NVGDrawNode:create()

    self:addChild(drawNode10)

    drawNode10:setColor(cc.c4f(1, 1, 1, 1))

    drawNode10:drawSolidRect(cc.p(330, 120), cc.p(430, 220), cc.c4f(0, 0, 0.5, 1))

 

    points = {}

    points[1] = cc.p(500, 400)

    points[2] = cc.p(600, 400)

    points[3] = cc.p(550, 500)

    local drawNode11 = cc.NVGDrawNode:create()

    self:addChild(drawNode11)

    drawNode11:drawSolidPolygon(points, 3, cc.c4f(0.5, 0.5, 0, 1))

   

    local drawNode12 = cc.NVGDrawNode:create()

    self:addChild(drawNode12)

    drawNode12:setFill(true)

    drawNode12:setFillColor(cc.c4f(1, 1, 1, 1))

    drawNode12:drawArc(cc.p(50, 200), 50, 30, 200, 1, cc.c4f(0, 0.5, 0.5, 1))

 

    local points = {}

    points[1] = cc.p(10, 300)

    points[2] = cc.p(200, 320)

    points[3] = cc.p(180, 350)

    points[4] = cc.p(220, 410)

    local drawNode13 = cc.NVGDrawNode:create()

    self:addChild(drawNode13)

    drawNode13:setLineWidth(4)

    drawNode13:setColor(cc.c4f(0, 0.5, 0.5, 1))

    drawNode13:drawSolidPolygon(points, 4, cc.c4f(0.5, 0, 0.5, 1))

 

 

 

 

 

14.        相關函式

14.1   device

提供裝置相關屬性的查詢,以及裝置功能的訪問

當框架初始完成後,device 模組提供下列屬性:

·        device.platform 返回當前執行平臺的名字,可用值: ios, android, mac, windows.

·        device.model 返回裝置型號,可用值: unknown, iphone, ipad

·        device.language 返回裝置當前使用的語言,可用值:

o    cn:中文

o    fr:法語

o    it:義大利語

o    gr:德語

o    sp:西班牙語

o    ru:俄語

o    jp:日語

o    en:英語

·        device.writablePath 返回裝置上可以寫入資料的首選路徑:

o    iOS 上返回應用程式所在的 Documents 目錄

o    Android 上返回儲存卡的根目錄

o    其他平臺的返回值由 quick-x-player 決定

·        device.cachePath 返回裝置上可以寫入資料的快取目錄:

o    iOS 上返回應用程式所在的 Library/Caches 目錄

o    其他平臺的返回值同 device.writablePath

·        device.directorySeparator 目錄分隔符,在 Windows 平臺上是 “\”,其他平臺都是 “/”

·        device.pathSeparator 路徑分隔符,在 Windows 平臺上是 “;”,其他平臺都是 “:”

Functions

device.showActivityIndicator()

顯示活動指示器

device.hideActivityIndicator()

隱藏正在顯示的活動指示器

device.showAlert(title, message, buttonLabels, listener)

顯示一個包含按鈕的彈出對話方塊

device.cancelAlert()

取消正在顯示的對話方塊。

device.getOpenUDID()

返回裝置的 OpenUDID

device.openURL(url)

用瀏覽器開啟指定的網址

device.showInputBox(title, message, defaultValue)

顯示一個輸入框,並返回使用者輸入的內容。

 

14.2   display

與顯示影象、場景有關的功能

 

display 模組封裝了絕大部分與顯示有關的功能,並負責根據 config.lua 中定義的解析度設定計算螢幕的設計解析度。

 

框架初始化後,display 模組提供下列屬性:

·        display.sizeInPixels.width,

·        display.sizeInPixels.height螢幕的畫素解析度

·        display.widthInPixels,

·        display.heightInPixels 螢幕的畫素解析度

·        display.contentScaleFactor 內容縮放因子

·        display.size.width,

·        display.size.height 螢幕的設計解析度

·        display.width,

·        display.height 螢幕的設計解析度

·        display.cx,

·        display.cy 螢幕中央的 x 座標和 y 座標

·        display.left,

·        display.top,

·        display.right,

·        display.bottom 螢幕四邊的座標

·        display.c_left,

·        display.c_top,

·        display.c_right,

·        display.c_bottom 當父物件在螢幕中央時,螢幕四邊的座標

 

 

14.3   network.createHTTPRequest()

network.createHTTPRequest(callback, url, method)

建立非同步 HTTP 請求,並返回 cc.HTTPRequest 物件。

 
function onRequestFinished(event)
    local ok = (event.name == "completed")
    local request = event.request
 
    if not ok then
        -- 請求失敗,顯示錯誤程式碼和錯誤訊息
        print(request:getErrorCode(), request:getErrorMess