cocos2dx-lua 笔记 >方向控制 v1
一直想找个现成的虚拟摇杆方向控制的插件,但是没有找到,所以就写了一个简单的先用着,
注:并没有按下按钮的动画效果
--[[ 控制层 --]] 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 --[[ 构造方法 @param linstener 需要接收事件通知的人,需要实现事件列表中的方法 事件列表为: setDir(dir) : 设置了方向 --]] function CtrlLayer:ctor(linstener) self.linstener = linstener self:pos(0, 0) self:size(display.width, display.height) --方向按钮图片 local dirSprite = display.newSprite('dir_btn.jpg') dirSprite:setAnchorPoint(0, 0) dirSprite:pos(btn_dir_x, btn_dir_y) dirSprite:addTo(self) --添加触屏单点事件 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才能让事件继续到move/ended等 return true elseif event.name == 'ended' then self:onTouchEnded(event) end end) end --计算某点是否在方向按钮范围 --规定在方向按钮外围构成的矩形为按钮的边界 function CtrlLayer:isInDirBtn(x, y) if x >= btn_dir_x and x <= (btn_dir_x + btn_dir_w) and y >= btn_dir_y and y <= (btn_dir_y + btn_dir_h) then return true else return false end end --计数某点是否在方向按钮的中心圆圈内 function CtrlLayer:isInDirBtnCenter(x, y) local tx = math.abs(x-btn_dir_cx) local ty = math.abs(y-btn_dir_cy) local tlen = math.sqrt( math.pow(tx, 2) + math.pow(ty, 2) ) return tlen <= 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:onTouchEnded(event) 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) end end end return CtrlLayer
图片: