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

 先贴出手柄类的代码


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_DOWN
			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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值