实现了一个模拟摇杆
--[[
虚拟摇杆类 Layer
几种组合方式:
1.固定位置 不自动隐藏
2.固定位置 自动隐藏
3.非固定位置 自动隐藏
Init 初始化
Release 释放
SetEnable 启用
IsEnable 是否启用
--]]
local NavigationLayer = class("NavigationLayer",function()
return cc.Layer:create()
end)
-- 8个方向
NavigationLayer.eDirection = {
None = 0,
U = 1,
UR = 2,
R = 3,
DR = 4,
D = 5,
DL = 6,
L = 7,
UL = 8
}
NavigationLayer._instance = nil
NavigationLayer._touchArea = nil
NavigationLayer._touchListener = nil
NavigationLayer._downPos = nil
NavigationLayer._isEnable = false
NavigationLayer._naviCallback = nil
NavigationLayer._rootNode = nil
NavigationLayer._naviBallNode = nil
NavigationLayer._radius = 0
NavigationLayer._naviPosition = nil -- nil时跟随点击位置
NavigationLayer._isAutoHide = true -- 非点击或移动状态自动隐藏
function NavigationLayer.GetInstance()
if NavigationLayer._instance == nil then
NavigationLayer._instance = NavigationLayer.new()
end
return NavigationLayer._instance
end
function NavigationLayer.ReleaseInstance()
if NavigationLayer._instance ~= nil then
NavigationLayer._instance:Release()
NavigationLayer._instance = nil
end
end
function NavigationLayer:ctor()
end
--[[参数表
isEnable 是否启用
isAutoHide 是否自动隐藏,如果没有固定位置,则此参数无效,按照自动隐藏处理
naviPosition 摇杆位置,nil则跟随点击位置,否则有固定位置
naviCsbName 摇杆csb路径,其中摇杆球需要在根节点下
ballKey 摇杆球的key,用于查找摇杆球
radius 摇杆半径
touchArea 有效触摸区域,在此区域内点击才会处理摇杆操作
naviCallback 方向更改回调,回传角度与8个反向,参考eDirection,角度以右为0,上为90,下为-90
]]
-- 初始化 naviPosition nil则根据点击位置变化 有值则固定位置
function NavigationLayer:Init(isEnable, isAutoHide, naviPosition, naviCsbName, ballKey, radius, touchArea, naviCallback)
-- 没有固定位置的 只能是自动隐藏
if naviPosition == nil then
isAutoHide = true
end
-- 加载ui
self._rootNode = cc.CSLoader:createNode(naviCsbName)
if self._rootNode &#