控制层

--[[
控制层
--]]
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 = linstenerself: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 = trueself:handleEvent(event, event.name)self.isHandleMove = falseelseif event.name == 'ended' thenself.touched = falseself:handleEvent(event, event.name)endend)
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 = dirself.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 

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

转载于:https://www.cnblogs.com/ooi-/p/4820557.html

cocos2dx-lua 笔记 方向控制 v2相关推荐

  1. cocos2d-x lua 学习笔记(1) -- 环境结构

    Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...

  2. cocos2d-x lua 学习笔记(1) -- 环境搭建

    Cocos2d-x 3.0以上版本的环境搭建和之前的Cocos2d-x 2.0 版差异较大的,同时从Cocos2d-x 3.0项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后, ...

  3. Arduino学习笔记(5)-- 步进电机转速和方向控制

    本文尝试用Arduino开发版控制42步进电机,搭配通用的步进电机驱动器,实现对步进电机的转速控制和方向控制. 原材料: Arduino开发板及附件 42步进电机和配套驱动器 电源 接线方式:共阴 总 ...

  4. cocos2d-x 学习笔记(1)关于cocos2d-x(环境配置,项目结构,文件说明)

    cocos2d-x 学习笔记(1)关于cocos2d-x(环境配置,项目结构,文件说明) 1.问:什么是cocos2d-x? 是一套开放源代码,主要基于c,c++语言,针对windows,linux, ...

  5. cocos2d-x 学习笔记(2)cocos2d-x重要概念,项目结构及 CCDirector 导演控件

    cocos2d-x 学习笔记(2)cocos2d-x重要概念及项目结构 在cocos2d引擎中,有几个概念,分别是导演,场景,布景和人物角色. 导演(CCDirector)在cocos2d-x引擎中, ...

  6. cocos2dx lua 日志系统

    在实际开发过程中,代码日志是必不可少的系统,尤其是在线上版本中,对于查找问题相当有帮助.但是cocos2dx lua的代码日志是基于lua的print打印,只写在console中,不会长久保存.怎么办 ...

  7. 方向控制中的动态比例值-P

    01问题提出   卓大大,我有一个问题想要请教.对于舵机的转向控制,高速的时候需要动态P才能得到平滑的控制效果(也就是偏差越小P越小,偏差越大P越大).   但对于电机的速度控制,在任何期望速度下,P ...

  8. cocos2d-x学习笔记15:cocos2d-x教程资源总结

    注:cocos2d可作为cocos2dx的参考,两者接口很相似. 名称:知易的<知易Cocos2D-iPhone开发教程> 官方地址:http://blog.sina.com.cn/s/a ...

  9. cocos2d-x学习笔记16:记录存储1:CCUserDefault

    cocos2d-x学习笔记16:记录存储1:CCUserDefault 一.简述 CCUserDefalt作为NSUserDefalt类的cocos2d-x实现版本,承担了cocos2d-x引擎的记录 ...

最新文章

  1. 关于unity的一个不错的插件平台
  2. 浅谈 Python 中的多线程。
  3. Oracle 数据库创建表空间、创建用户指定表空间
  4. 《视频直播技术详解》系列之七:现代播放器原理
  5. php分页技术的作用,分页原理技术细节剖析(php+mysql)实例
  6. 评选 cms_十大评选和编辑精选:12月评论
  7. python代码封装加密_静态编译python源代码,使用Nuitka加密你的py源码
  8. 2015湖南省选集训DAY5——work(BZOJ4177)
  9. 使用代理为业务操作添加安全检测
  10. 计算机原理与系统结构教程,计算机组成原理与系统结构实验教程.docx
  11. 超级芯片电路板问世 比现有电脑快9000倍
  12. Java常用设计模式(面试常考)
  13. oracle asm文件查找,Oracle ASM 文件管理
  14. 使用计算机有关的活动,有关计算机的活动策划书
  15. OJ 1478 机器翻译
  16. 超级计算机神威太湖之光储蓄量,中国超级计算机神威太湖之光世界最快,且总量排名榜单第一...
  17. Windows Server 2012 R2 安装 Office2016 和 Visual Studio 2015的问题
  18. Java+SQLServer实现——网上图书馆借还管理系统
  19. Android LiveData初识
  20. 4K秒开,稀缺宝藏影视APP!

热门文章

  1. Android开发笔记(一百零九)利用网盘实现云存储
  2. @RequestBody 的正确使用办法
  3. Ubuntu如何定时清理内存
  4. Android 动态移动控件实现
  5. 安装pptp ×××
  6. FineUI小技巧(3)表格导出与文件下载
  7. android 网络连接判断
  8. Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:排序和连接数据...
  9. 使用wmi显示rpc服务器不可用,详解WMI RPC 服务器不可用的解决方案
  10. python决策树代码解读_建模分析之机器学习算法(附pythonR代码)