• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

cocos2dx-lua 虚拟摇杆方向控制

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

话不多说,直接上代码

--[[

控制层
--]]

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
【转贴】如何在C++中集成Lua脚本(LuaPlus篇)发布时间:2022-07-22
下一篇:
Metatable让我从心认知了Lua(相知篇)发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap