话不多说,直接上代码
--[[
控制层
--]]
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
效果图如下
博客参考:https://www.cnblogs.com/ooi-/p/4820337.html
|
请发表评论