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:nobody@mycompany.com?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:getErrorMessage())
        return
    end
 
    local code = request:getResponseStatusCode()
    if code ~= 200 then
        -- 请求结束,但没有返回 200 响应代码
        print(code)
        return
    end
 
    -- 请求成功,显示服务端返回的内容
    local response = request:getResponseString()
    print(response)
end
 
-- 创建一个请求,并以 POST 方式发送数据到服务端
local url = "http://www.mycompany.com/request.php"
local request = network.createHTTPRequest(onRequestFinished, url, "POST")
request:addPOSTValue("KEY", "VALUE")
 
-- 开始请求。当请求完成时会调用 callback() 函数
request:start()
 

Returns

·        HTTPRequest 结果