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 

 

 

图片:

 

posted @ 2015-09-18 21:01  行-云  阅读(646)  评论(0编辑  收藏  举报