cocos2dx-lua虚拟摇杆方向控制
2023-02-18 16:41:11 时间
在游戏开发中,很多时候都需要控制游戏角色的移动,比如王者荣耀中对英雄的控制,我们可以做一个虚拟摇杆来实现
--[[
控制层
--]]
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
效果图如下
相关文章
- 带你掌握java反序列化漏洞及其检测
- 这几种Java异常处理方法,你会吗?
- 教你用Java7的Fork/Join框架开发高并发程序
- Java变异出现错误:No enclosing instance of type XXX is accessible
- LeetCode - #70 爬楼梯(Top 100)
- LeetCode - #71 简化路径
- LeetCode - #72 编辑距离(Top 100)
- LeetCode - #73 矩阵置零
- LeetCode - #74 搜索二维矩阵
- [Maven进阶]聚合和继承
- Ichunqiu云境 - Delegation Writeup
- 在搭载 M1 及 M2 芯片 MacBook 设备上玩 Stable Diffusion 模型
- 在 Ubuntu 上安装 Discourse 开发环境
- 用户重复注册分析-多线程事务中加锁引发的bug
- 基于51单片机的简易抢答器
- 设计分享|74HC154译码器实现流水灯
- adobe photoshop软件2023最新版下载安装
- Photoshop2023最新完美版一键式安装教程
- DaVinci Resolve2023永久免费版下载安装教程
- 3dmax软件2023最新免费版下载