码迷,mamicode.com
首页 > 其他好文 > 详细

cocos2dx-lua 笔记 >方向控制 v2

时间:2015-09-18 23:21:04      阅读:331      评论:0      收藏:0      [点我收藏+]

标签:

控制层

--[[
控制层
--]]
local LayoutUtils = require(app.common.LayoutUtils)
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
--当用户按下未抬起时,连续触发事件的频率
local frequency = 0.02
--[[
构造方法
@param linstener 需要接收事件通知的人,需要实现事件列表中的方法
事件列表为:
    setDir(dir) : 设置了方向
    dirChanged(dir) : 方向改变了
--]]
function CtrlLayer:ctor(linstener)
    self.linstener = linstener
    self:pos(0, 0)
    self:size(display.width, display.height)
    --当前的方向
    self.dir = ‘‘ 
    --方向按钮图片 
    local dirSprite = display.newSprite(dir_btn.jpg)
    dirSprite:setAnchorPoint(0, 0)
    dirSprite:pos(btn_dir_x, btn_dir_y)
    dirSprite:addTo(self)
    --触屏是否开始
    self.touched = false
    --是否在处理滑动
    self.isHandleMove = false
    --长按事件调度
    local scheduler = cc.Director:getInstance():getScheduler()
    scheduler:scheduleScriptFunc(function(dt)
        self:press(dt)
    end, frequency, false)
    
    --添加触屏事件
    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才能让事件继续到moved/ended等
            self.touched = true 
            return true 
        elseif event.name == moved then 
            self.isHandleMove = true
            self:handleEvent(event, event.name)
            self.isHandleMove = false
        elseif event.name == ended then
            self.touched = false
            self:handleEvent(event, event.name)
        end
    end)
end
--计算某点是否在方向按钮范围
--规定在方向按钮外围构成的矩形为按钮的边界
--2015-09-18 将外围范围改为圆形,与图片显示边界保持一致
function CtrlLayer:isInDirBtn(x, y)
    return LayoutUtils.inCircle(x, y, btn_dir_cx, btn_dir_cy, btn_dir_w/2)
end
--计数某点是否在方向按钮的中心圆圈内
function CtrlLayer:isInDirBtnCenter(x, y)
    return LayoutUtils.inCircle(x, y, btn_dir_cx, btn_dir_cy, 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:handleEvent(event, eventName)
    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)
            if dir ~= self.dir then 
                self.dir = dir
                self.linstener:dirChanged(dir)
            end 
        else 
            self.dir = ‘‘
        end 
    else 
        self.dir = ‘‘
    end 
end
--长按事件处理
function CtrlLayer:press(dt)
    if self.touched and not self.isHandleMove then 
        if self.dir ~= ‘‘ then 
            self.linstener:setDir(self.dir)
        end 
    end 
end 
return CtrlLayer 

 

工具模块

--[[-
位置计算相关的便利操作
-]]
local LayoutUtils = {}
--[[
某点是否在圆形内
@param x 点位置
@param y 
@param cx 圆的位置
@param cy 
@param r 圆的半径
--]]
function LayoutUtils.inCircle(x, y, cx, cy, r)
    local tx = math.abs(x-cx)
    local ty = math.abs(y-cy)
    local tlen = math.sqrt( math.pow(tx, 2) + math.pow(ty, 2) )
    return tlen <= r
end 
--[[
某点是否在矩形内
@param x 点位置
@param y 
@param rectX 矩形的位置
@param rectY
@param rectW 矩形的大小
@param rectH
--]]
function LayoutUtils.inRect(x, y, rectX, rectY, rectW, rectH)
    if x >= rectX and x <= (rectX + rectW) and y >= rectY and y <= (rectY + rectH) then 
        return true 
    else 
        return false 
    end
end 
return LayoutUtils 

 

没有任何效果,就一张图片

技术分享

cocos2dx-lua 笔记 >方向控制 v2

标签:

原文地址:http://www.cnblogs.com/ooi-/p/4820557.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!