cocos2dx-lua 笔记 方向控制 v2
控制层
--[[ 控制层 --]] 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相关推荐
- cocos2d-x lua 学习笔记(1) -- 环境结构
Cocos2d-x 3.0超过环境的版本号来建立和前Cocos2d-x 2.0 差异较大的版本,从同时Cocos2d-x 3.0项目打包成apkAndroid的应用程序文件,步骤,构建环境有些乏味安德 ...
- cocos2d-x lua 学习笔记(1) -- 环境搭建
Cocos2d-x 3.0以上版本的环境搭建和之前的Cocos2d-x 2.0 版差异较大的,同时从Cocos2d-x 3.0项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后, ...
- Arduino学习笔记(5)-- 步进电机转速和方向控制
本文尝试用Arduino开发版控制42步进电机,搭配通用的步进电机驱动器,实现对步进电机的转速控制和方向控制. 原材料: Arduino开发板及附件 42步进电机和配套驱动器 电源 接线方式:共阴 总 ...
- cocos2d-x 学习笔记(1)关于cocos2d-x(环境配置,项目结构,文件说明)
cocos2d-x 学习笔记(1)关于cocos2d-x(环境配置,项目结构,文件说明) 1.问:什么是cocos2d-x? 是一套开放源代码,主要基于c,c++语言,针对windows,linux, ...
- cocos2d-x 学习笔记(2)cocos2d-x重要概念,项目结构及 CCDirector 导演控件
cocos2d-x 学习笔记(2)cocos2d-x重要概念及项目结构 在cocos2d引擎中,有几个概念,分别是导演,场景,布景和人物角色. 导演(CCDirector)在cocos2d-x引擎中, ...
- cocos2dx lua 日志系统
在实际开发过程中,代码日志是必不可少的系统,尤其是在线上版本中,对于查找问题相当有帮助.但是cocos2dx lua的代码日志是基于lua的print打印,只写在console中,不会长久保存.怎么办 ...
- 方向控制中的动态比例值-P
01问题提出 卓大大,我有一个问题想要请教.对于舵机的转向控制,高速的时候需要动态P才能得到平滑的控制效果(也就是偏差越小P越小,偏差越大P越大). 但对于电机的速度控制,在任何期望速度下,P ...
- cocos2d-x学习笔记15:cocos2d-x教程资源总结
注:cocos2d可作为cocos2dx的参考,两者接口很相似. 名称:知易的<知易Cocos2D-iPhone开发教程> 官方地址:http://blog.sina.com.cn/s/a ...
- cocos2d-x学习笔记16:记录存储1:CCUserDefault
cocos2d-x学习笔记16:记录存储1:CCUserDefault 一.简述 CCUserDefalt作为NSUserDefalt类的cocos2d-x实现版本,承担了cocos2d-x引擎的记录 ...
最新文章
- 关于unity的一个不错的插件平台
- 浅谈 Python 中的多线程。
- Oracle 数据库创建表空间、创建用户指定表空间
- 《视频直播技术详解》系列之七:现代播放器原理
- php分页技术的作用,分页原理技术细节剖析(php+mysql)实例
- 评选 cms_十大评选和编辑精选:12月评论
- python代码封装加密_静态编译python源代码,使用Nuitka加密你的py源码
- 2015湖南省选集训DAY5——work(BZOJ4177)
- 使用代理为业务操作添加安全检测
- 计算机原理与系统结构教程,计算机组成原理与系统结构实验教程.docx
- 超级芯片电路板问世 比现有电脑快9000倍
- Java常用设计模式(面试常考)
- oracle asm文件查找,Oracle ASM 文件管理
- 使用计算机有关的活动,有关计算机的活动策划书
- OJ 1478 机器翻译
- 超级计算机神威太湖之光储蓄量,中国超级计算机神威太湖之光世界最快,且总量排名榜单第一...
- Windows Server 2012 R2 安装 Office2016 和 Visual Studio 2015的问题
- Java+SQLServer实现——网上图书馆借还管理系统
- Android LiveData初识
- 4K秒开,稀缺宝藏影视APP!
热门文章
- Android开发笔记(一百零九)利用网盘实现云存储
- @RequestBody 的正确使用办法
- Ubuntu如何定时清理内存
- Android 动态移动控件实现
- 安装pptp ×××
- FineUI小技巧(3)表格导出与文件下载
- android 网络连接判断
- Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:排序和连接数据...
- 使用wmi显示rpc服务器不可用,详解WMI RPC 服务器不可用的解决方案
- python决策树代码解读_建模分析之机器学习算法(附pythonR代码)