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 |
|
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.
增加事件監聽 EventTest1,EventTest2
7.1 addEventListener
為代理事件增加事件監聽 EventTest3,EventTest4。
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 |
顯示活動指示器 |
隱藏正在顯示的活動指示器 |
顯示一個包含按鈕的彈出對話方塊 |
取消正在顯示的對話方塊。 |
返回裝置的 OpenUDID 值 |
用瀏覽器開啟指定的網址 |
顯示一個輸入框,並返回使用者輸入的內容。 |
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