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)
其中函数display.addSpriteFrames()
display.addSpriteFrames(plistFilename,image,handler)
将指定的 Sprite Sheets 材质文件及其数据文件载入图像帧缓存。
格式:
display.addSpriteFrames(数据文件名,材质文件名)
1 2 3 4 5 6 7 8 |
|
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
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)
7.framework.event
local items = {
"addEventListener",
"removeEventListener",
"removeAllListener",
"removeCoin",
"sendEvent"
}
先进行初始化,创建node增加图片Coin0001.png.
增加事件监听 EventTest1,EventTest2
7.1addEventListener
为代理事件增加事件监听 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.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函数用于判断对象是否属于指定的类。
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 |
显示活动指示器 |
隐藏正在显示的活动指示器 |
显示一个包含按钮的弹出对话框 |
取消正在显示的对话框。 |
返回设备的 OpenUDID 值 |
用浏览器打开指定的网址 |
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 结果
原文链接:https://www.f2er.com/cocos2dx/343877.html