cocos2dx-lua 虚拟摇杆方向控制

话不多说,直接上代码

--[[

控制层
--]]

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

发布了65 篇原创文章 · 获赞 141 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/Silent_F/article/details/86592284