标签:
控制层
--[[ 控制层 --]] local LayoutUtils = require(‘app.common.LayoutUtils‘) local CtrlLayer = class(‘CtrlLayer‘, function() return display.newLayer(‘CtrlLayer‘) end) --方向按钮的size local btn_dir_w = 265 local btn_dir_h = 265 --方向按钮位置 local btn_dir_x = display.width - btn_dir_w - 20 local btn_dir_y = 20 --方向按钮的中心点 local btn_dir_cx = btn_dir_x + btn_dir_w/2 local btn_dir_cy = btn_dir_y + btn_dir_h/2 --方向按钮中心圆圈的半径 local btn_dir_center_r = 50 --当用户按下未抬起时,连续触发事件的频率 local frequency = 0.02 --[[ 构造方法 @param linstener 需要接收事件通知的人,需要实现事件列表中的方法 事件列表为: setDir(dir) : 设置了方向 dirChanged(dir) : 方向改变了 --]] function CtrlLayer:ctor(linstener) self.linstener = linstener self:pos(0, 0) self:size(display.width, display.height) --当前的方向 self.dir = ‘‘ --方向按钮图片 local dirSprite = display.newSprite(‘dir_btn.jpg‘) dirSprite:setAnchorPoint(0, 0) dirSprite:pos(btn_dir_x, btn_dir_y) dirSprite:addTo(self) --触屏是否开始 self.touched = false --是否在处理滑动 self.isHandleMove = false --长按事件调度 local scheduler = cc.Director:getInstance():getScheduler() scheduler:scheduleScriptFunc(function(dt) self:press(dt) end, frequency, false) --添加触屏事件 self:setTouchEnabled(true) --self:setTouchMode(cc.TOUCHES_ALL_AT_ONCE) self:setTouchMode(cc.TOUCHES_ONE_BY_ONE) self:addNodeEventListener(cc.NODE_TOUCH_EVENT, function(event) if event.name == ‘began‘ then --需要return true才能让事件继续到moved/ended等 self.touched = true return true elseif event.name == ‘moved‘ then self.isHandleMove = true self:handleEvent(event, event.name) self.isHandleMove = false elseif event.name == ‘ended‘ then self.touched = false self:handleEvent(event, event.name) end end) end --计算某点是否在方向按钮范围 --规定在方向按钮外围构成的矩形为按钮的边界 --2015-09-18 将外围范围改为圆形,与图片显示边界保持一致 function CtrlLayer:isInDirBtn(x, y) return LayoutUtils.inCircle(x, y, btn_dir_cx, btn_dir_cy, btn_dir_w/2) end --计数某点是否在方向按钮的中心圆圈内 function CtrlLayer:isInDirBtnCenter(x, y) return LayoutUtils.inCircle(x, y, btn_dir_cx, btn_dir_cy, btn_dir_center_r) end --计数某点相对于方向按钮的中心点的方向 --规定方向有up/right/down/left function CtrlLayer:getDir(x, y) local dir = ‘‘ local tx = math.abs(x - btn_dir_cx) local ty = math.abs(y - btn_dir_cy) if x > btn_dir_cx then if y > btn_dir_cy then if tx > ty then dir = ‘right‘ else dir = ‘up‘ end else if tx > ty then dir = ‘right‘ else dir = ‘down‘ end end else if y > btn_dir_cy then if tx > ty then dir = ‘left‘ else dir = ‘up‘ end else if tx > ty then dir = ‘left‘ else dir = ‘down‘ end end end return dir end --事件处理 function CtrlLayer:handleEvent(event, eventName) local x, y = event.x, event.y if self:isInDirBtn(x, y) then --在大圆内部 if not self:isInDirBtnCenter(x, y) then --在小圆外部 local dir = self:getDir(x, y) self.linstener:setDir(dir) if dir ~= self.dir then self.dir = dir self.linstener:dirChanged(dir) end else self.dir = ‘‘ end else self.dir = ‘‘ end end --长按事件处理 function CtrlLayer:press(dt) if self.touched and not self.isHandleMove then if self.dir ~= ‘‘ then self.linstener:setDir(self.dir) end end end return CtrlLayer
工具模块
--[[- 位置计算相关的便利操作 -]] local LayoutUtils = {} --[[ 某点是否在圆形内 @param x 点位置 @param y @param cx 圆的位置 @param cy @param r 圆的半径 --]] function LayoutUtils.inCircle(x, y, cx, cy, r) local tx = math.abs(x-cx) local ty = math.abs(y-cy) local tlen = math.sqrt( math.pow(tx, 2) + math.pow(ty, 2) ) return tlen <= r end --[[ 某点是否在矩形内 @param x 点位置 @param y @param rectX 矩形的位置 @param rectY @param rectW 矩形的大小 @param rectH --]] function LayoutUtils.inRect(x, y, rectX, rectY, rectW, rectH) if x >= rectX and x <= (rectX + rectW) and y >= rectY and y <= (rectY + rectH) then return true else return false end end return LayoutUtils
没有任何效果,就一张图片
标签:
原文地址:http://www.cnblogs.com/ooi-/p/4820557.html