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.7VibrateVibrate 调用函数cc.Native:vibrate()实现振动。
3.framework.displaylocal 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(数据文件名,材质文件名)
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.cryptolocal items = { "AES256", "XXTEA", "Base64", "MD5File", "MD5", } 4.1AES256进行AES256加密解密操作。
4.2XXTEAXXTEA加密,如下代码: 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.3Base64Base64加密解密操作。同XXTEA。 4.4MD5FileMD5算法,对文件进行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.networklocal items = { "createHTTPRequest", "createHTTPRequestBadDomain", "send data to server", "isLocalWiFiAvailable", "isInternetConnectionAvailable", "isHostNameReachable", "getInternetConnectionStatus", } 其中onResponse函数处理HTTP相关事件。 如果事件不是progress则报错,如果是competeled则获取数据长度,如果dumpResponse为true则打印String。 其他则打印”----------------------------------”。 5.1createHTTPRequestlocal 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.luabindinglocal items = { "avoidPeertableGC", "getCppFunction", } 6.1avoidPeertableGClocal 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.eventlocal 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.interfacelocal items = { "register", "modebase", "functions" } 主要是3个常用接口。 8.1Registerlocal 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.2Modebaselocal mvcBase =require("framework.cc.mvc.ModelBase")
8.3functions创建两个类Animal,Duck. Iskindof函数用于判断对象是否属于指定的类。 调用math相关函数等LUA相关的函数。 9.framework.socketTcplocal 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 平台上是 “;”,其他平台都是 “:”
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 结果 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ruby-on-rails – 为什么初始化变量如此重要?
- ruby-on-rails – Rails Active Record取消(保存或创建)bef
- 为什么需要Visual C Redistributable Package?
- ruby-on-rails – 设置默认数据库连接Rails
- 如何启用Flash调试器?
- Ajax的属性
- iphone – 显示18年前的datepicker并在ios中锁定ui datepic
- EXTJS4 之 TreePanel
- oracle – ORA-12705:无法访问NLS数据文件或指定的无效环境
- c# – Visual Studio 2012中的页面控件和事件转到了代码隐藏