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.1activityIndicator

显示显示活动指示器,2秒后调用函数隐藏显示活动指示器,并停止调用函数

2.2showAlert

代码如下:

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.3openWebbrowser

打开浏览器如下图:

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

2.4callme

通过如下函数拨打电话:

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

2.5sendEmail

通过如下代码,打开设备上的邮件程序,并创建新邮件,填入收件人地址

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.6getInputText

获取输入信息

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

2.7Vibrate

Vibrate 调用函数cc.Native:vibrate()实现振动。

3.framework.display

local items = {

"addImageAsync",

"scale9Sprite",

"tilessprite",

"tiledBatchNode",

"drawNode",

"progress",

"layerMultiTouch"

}

3.1addImageAsync

异步加载图片

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.2scale9Sprite

通过命令newScale9Sprite,创建图片GreenButton.png创建精灵

设置精灵范围最后设置fadeout和fadein.

3.3tilessprite

通过如下命令创建一个图片组成的tilesprite,密集恐惧症的小朋友要慎入。

self.tilessprite_ = display.newTilessprite("close.png",cc.rect(10, 10,100,100))

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

:addTo(self)

3.4tiledBatchNode

代码如下:

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",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

·stringplistFilename数据文件

·stringimage材质文件

3.5drawNode

初始化了一个node节点,进行画图。

一个实心圆,一个空心圆,一个方形,一个直线,一个三角型。

3.6progress

创建一个原型的进度条

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

:pos(100, 100)

:addTo(self)

progress:setPercentage(60)

self.progressNode_ = progress

3.7layerMultiTouch

创建一个新的Layer.为其增加监听,回调函数为onTouch函数

onTouch函数实现多点触摸。

4.framework.crypto

local items = {

"AES256",

"XXTEA",

"Base64",

"MD5File",

"MD5",

}

4.1AES256

进行AES256加密解密操作。

4.2XXTEA

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))

4.3Base64

Base64加密解密操作。同XXTEA

4.4MD5File

MD5算法,对文件进行md5计算,代码如下

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

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

4.5MD5

对字符串进行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.1createHTTPRequest

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.2createHTTPRequestBadDomain

代码同上,只是连接到一个不存在的HTTP地址上去。

5.3senddata to server

通过POST命令,发送数据到SERVER。

5.4isLocalWiFiAvailable

判断本地WIFI是否可用。

5.5isInternetConnectionAvailable

判断网连接是否可用。

5.6isHostNameReachable

判断一个网址是否可达。

5.7getInternetConnectionStatus

通过network.getInternetConnectionStatus()命令,判断互联网、WIFI、3G网络是否可用。

6.framework.luabinding

local items = {

"avoidPeertableGC",

"getCppFunction",

}

6.1avoidPeertableGC

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,tostring(node.customVar)) -- 1

self:performWithDelay(function()

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

local node2 = self:getChildByTag(1)

collectgarbage()

collectgarbage()

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

self:removeChildByTag(1)

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

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

end, 1.0)

6.2getCppFunction

-- 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,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",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.1addEventListener

为代理事件增加事件监听 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.2removeEventListener

移除事件EventTest1,EventTest2,EventTest3.

通过三种不同的方法如下:

self.eventProxy:removeEventListener(self.eventHandle2)

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

self.eventProxy:removeEventListener(eventHandle1)

self.eventProxy:removeAllEventListenersForEvent("EventTest3")

7.3removeAllListener

移除所有监听程序。

7.4removeCoin

移除coin精灵,当coin移除的时候添加的事件监听程序也消失。

7.5sendEvent

分发EventTest事件。

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

8.framework.interface

local items = {

"register",

"modebase",

"functions"

}

主要是3个常用接口。

8.1Register

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.2Modebase

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

8.3functions

创建两个类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.1Connect

链接127.0.0.1。

9.2SendData

Socket发送信息。

9.3Close

关闭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, 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,cc.c4f(0,1, 1))

local drawNode3 = cc.NVGDrawNode:create()

self:addChild(drawNode3)

drawNode3:drawLine(quarLB,quarRT, 1))

local drawNode4 = cc.NVGDrawNode:create()

self:addChild(drawNode4)

drawNode4:drawRect(quarLB, 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, 1,1))

local drawNode6 = cc.NVGDrawNode:create()

self:addChild(drawNode6)

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

local drawNode7 = cc.NVGDrawNode:create()

self:addChild(drawNode7)

drawNode7:drawQuadBezier(quarLB,cc.p(quarRT.x, quarLB.y),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,cc.c4f(0.5, 1))

local drawNode9 = cc.NVGDrawNode:create()

self:addChild(drawNode9)

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

local drawNode10 = cc.NVGDrawNode:create()

self:addChild(drawNode10)

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

drawNode10:drawSolidRect(cc.p(330,120),cc.p(430,220), 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, 1))

local drawNode12 = cc.NVGDrawNode:create()

self:addChild(drawNode12)

drawNode12:setFill(true)

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

drawNode12:drawArc(cc.p(50,200),50, 30,200, 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, 1))

drawNode13:drawSolidpolygon(points, 1))

14.相关函数

14.1device

提供设备相关属性查询,以及设备功能的访问

当框架初始完成后,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,defaultValue)

显示一个输入框,并返回用户输入的内容

14.2display

显示图像、场景有关的功能

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.3network.createHTTPRequest()

network.createHTTPRequest(callback,url,method)

创建异步 HTTP 请求,并返回 cc.HTTPRequest 对象。

 
function onRequestFinished(event)
local"completed"ok = (event.name ==)
localrequest = event.request
 
ifnotthenok
-- 请求失败,显示错误代码错误消息
print(request:getErrorCode(),request:getErrorMessage())
return
end
 
localcode = request:getResponseStatusCode()
if200thencode ~=
-- 请求结束,但没有返回 200 响应代码
print(code)
return
end
 
-- 请求成功,显示服务端返回的内容
localresponse = request:getResponseString()
print(response)
end
 
-- 创建一个请求,并以 POST 方式发送数据到服务端
local"http://www.mycompany.com/request.PHP"url =
local"POST"request = network.createHTTPRequest(onRequestFinished,)
"KEY""VALUE"request:addPOSTValue(,)
 
-- 开始请求。当请求完成时会调用 callback() 函数
request:start()
 

Returns

·HTTPRequest 结果

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...