您的位置:首页 > 移动开发 > Cocos引擎

quick-cocos2d-x 虚拟手柄实现实例

2016-12-05 19:27 295 查看
 先贴出手柄类的代码

local RockerLayer = class("RockerLayer", function ( )
return display.newNode();
end)

--定义摇杆的九种状态
tagDirection = {
rocker_STAY = 0,
rocker_RIGHT = 1,
rocker_UP = 2,
rocker_LEFT = 3,
rocker_DOWN = 4,
rocker_LEFT_UP = 5,
rocker_LEFT_DOWN = 6,
rocker_RIGHT_UP = 7,
rocker_RIGHT_DOWN = 8
}

function RockerLayer:ctor( )
self:initRocker()
end

function RockerLayer:initRocker( )
--添加背景
local bg = display.newSprite("zhucheng.png")
bg:pos(display.cx,display.cy)
bg:addTo(self)
--摇杆背景
self.RockerBG = display.newSprite("caogan-waiyuan.png")
self.RockerBG:pos(self.RockerBG:getContentSize().width/2 + 30, self.RockerBG:getContentSize().width/2 + 30)
self.RockerBG:addTo(self)
--添加摇杆
self.Rocker = display.newSprite("caozuodian1.png")
:pos(self.RockerBG:getPosition())
:addTo(self)
--圆心点 (限制摇杆活动 区域)
self.RockerBGPos = {}
self.RockerBGPos.x = self.RockerBG:getPositionX();
self.RockerBGPos.y = self.RockerBG:getPositionY();
--设置半径
self.RockerBGR = self.RockerBG:getContentSize().width/2

self:addTouch()
end
--求两点之间的距离
function RockerLayer:distance( p1,p2 )
return math.sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y))
end
--两点之间的角度
function RockerLayer:corea( p1,p2 )
return (p1.x - p2.x)/(self:distance(p1, p2))
end
--判断方向
function RockerLayer:checkdirection( angle,p)
--第一象限
if (p.x >= self.RockerBGPos.x) and (p.y >= self.RockerBGPos.y) then
if (math.radian2angle(angle)>22.5)and (math.radian2angle(angle)<67.5) then
--右上
self.move = tagDirection.rocker_RIGHT_UP
return
elseif (math.radian2angle(angle)<22.5) then
--向右
self.move = tagDirection.rocker_RIGHT
return
elseif (math.radian2angle(angle)>67.5) then
--向上
self.move = tagDirection.rocker_UP
return
end
--第二象限
elseif (p.x < self.RockerBGPos.x) and (p.y > self.RockerBGPos.y) then
if (math.radian2angle(angle)>112.5)and (math.radian2angle(angle)<157.5) then
--左上
self.move = tagDirection.rocker_LEFT_UP
return
elseif (math.radian2angle(angle)<112.5) then
--向上
self.move = tagDirection.rocker_UP
return
elseif (math.radian2angle(angle)>157.5) then
--向左
self.move = tagDirection.rocker_LEFT
return
end
--第三象限
elseif (p.x < self.RockerBGPos.x) and (p.y < self.RockerBGPos.y) then
if (math.radian2angle(angle)>112.5)and (math.radian2angle(angle)<157.5) then
--左下
self.move = tagDirection.rocker_LEFT_DOWN
return
elseif (math.radian2angle(angle)<112.5) then
--向左
self.move = tagDirection.rocker_LEFT
return
elseif (math.radian2angle(angle)>157.5) then
--向下
self.move = tagDirection.rocker_DOWN
return
end
--第四象限
elseif (p.x >= self.RockerBGPos.x) and (p.y <= self.RockerBGPos.y) then
if (math.radian2angle(angle)>22.5)and (math.radian2angle(angle)<67.5) then
--右下
self.move = tagDirection.rocker_RIGHT_DOWN
return
elseif (math.radian2angle(angle)<22.5) then
--向下
self.move = tagDirection.rocker_DOW
4000
N
return
elseif (math.radian2angle(angle)>67.5) then
--向右
self.move = tagDirection.rocker_RIGHT
return
end
end
end

--touch函数
function RockerLayer:addTouch( )
--三个监听回调函数
function touchbegan( location,event )
local p = location:getLocation()
--若比半径大返回false
if self:distance(p, self.RockerBGPos)<self.RockerBGR then
return true;
end
return false;
end

function touchmoved( location,event )
local p = location:getLocation()
angle = math.acos(self:corea(p, self.RockerBGPos))
self:checkdirection(angle, p)
--设置位置
--若移动距离超出范围
if self:distance(p, self.RockerBGPos)>self.RockerBGR then
local x = self.RockerBGR * math.cos(angle)
local y = self.RockerBGR * math.sin(angle)
--控制移动不能超出范围
if p.y > self.RockerBGPos.y then
self.Rocker:setPosition(cc.p(self.RockerBGPos.x+x,self.RockerBGPos.y+y))
else
self.Rocker:setPosition(cc.p(self.RockerBGPos.x+x,self.RockerBGPos.y-y))
end
else
self.Rocker:setPosition(p)
end
end

--回到中心
function touchended( location,event )
self.move = 0
self.Rocker:setPosition(self.RockerBGPos)

end

--注册监听
local listener = cc.EventListenerTouchOneByOne:create()
local dis = cc.Director:getInstance():getEventDispatcher()

--增加监听事件
listener:registerScriptHandler(touchbegan,cc.Handler.EVENT_TOUCH_BEGAN)
listener:registerScriptHandler(touchmoved,cc.Handler.EVENT_TOUCH_MOVED)
listener:registerScriptHandler(touchended,cc.Handler.EVENT_TOUCH_ENDED)
dis:addEventListenerWithSceneGraphPriority(listener, self)
end

return RockerLayer


MainScene中的实现

--定时器头文件
scheduler = require(cc.PACKAGE_NAME .. ".scheduler")
RockerLayer = require("app.scenes.RockerLayer")

local MainScene = class("MainScene", function()
return display.newScene("MainScene")
end)

function MainScene:ctor()
self.rocker = RockerLayer.new()
self:addChild(self.rocker)

--创建精灵
self.hero = display.newSprite("enemy1.png")
self.hero:pos(display.cx,display.cy)
self:addChild( self.hero)
--开启定时器
self.scheduler = scheduler.scheduleGlobal(handler(self, self.update),0.1)
end

function MainScene:update( )
if self.rocker.move == tagDirection.rocker_STAY then

elseif self.rocker.move == tagDirection.rocker_UP then
--向上移动
self.hero:setPosition(self.hero:getPositionX(),self.hero:getPositionY()+10)
elseif self.rocker.move == tagDirection.rocker_RIGHT then
--向右移动
self.hero:setPosition(self.hero:getPositionX()+10,self.hero:getPositionY())
elseif self.rocker.move == tagDirection.rocker_LEFT then
--向左移动
self.hero:setPosition(self.hero:getPositionX()-10,self.hero:getPositionY())
elseif self.rocker.move == tagDirection.rocker_DOWN then
--向下移动
self.hero:setPosition(self.hero:getPositionX(),self.hero:getPositionY()-10)

elseif self.rocker.move == tagDirection.rocker_RIGHT_UP then
--向右上移动
self.hero:setPosition(self.hero:getPositionX()+6,self.hero:getPositionY()+8)
elseif self.rocker.move == tagDirection.rocker_LEFT_UP then
--向左上移动
self.hero:setPosition(self.hero:getPositionX()-6,self.hero:getPositionY()+8)
elseif self.rocker.move == tagDirection.rocker_RIGHT_DOWN then
--向右下移动
self.hero:setPosition(self.hero:getPositionX()+6,self.hero:getPositionY()-8)
elseif self.rocker.move == tagDirection.rocker_LEFT_DOWN then
--向左下移动
self.hero:setPosition(self.hero:getPositionX()-6,self.hero:getPositionY()-8)
end
end

function MainScene:onEnter()
end

function MainScene:onExit()
end

return MainScene
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐