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 = linstener
    self: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 = true
            self:handleEvent(event, event.name)
            self.isHandleMove = false
        elseif event.name == ‘ended‘ then
            self.touched = false
            self:handleEvent(event, event.name)
        end
    end)
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 = dir
                self.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 

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

时间: 2024-08-28 08:47:38

cocos2dx-lua 笔记 >方向控制 v2的相关文章

cocos2dx-lua 笔记 &gt;方向控制 v1

一直想找个现成的虚拟摇杆方向控制的插件,但是没有找到,所以就写了一个简单的先用着, 注:并没有按下按钮的动画效果 --[[ 控制层 --]] 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 = displa

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

Cocos2d-x 3.0以上版本的环境搭建和之前的Cocos2d-x 2.0 版差异较大的,同时从Cocos2d-x 3.0项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷!OK,现在就开始搭建环境吧! 1.cocos2d-x环境的设置以及android的环境搭建 1.下载cocos2d-x 3.0正式版 2.下载android的sdk以及ndk 3.下载ant (注:cocos2d-x的环境变量配置需要用到ant,主要是android需要使用到它)

Cocos2d-x学习笔记—事件处理机制

Cocos2d-x学习笔记-事件处理机制 一:事件处理机制 一个事件由触发到完成响应,主要由以下三部分组成: 事件分发器EventDispatcher: 事件类型EventTouch.EventKeyboard等: 事件监听器EventListenerTouch.EventListenerKeyboard等. 在Cocos2d-x v3.x中,关于事件的东西,无非就是围绕上述的三个部分展开来的,掌握了上述的三个部分,也就掌握了Cocos2d-x v3.x中事件处理的精髓. (1)事件分发器: 事

【转】cocos2d-x Lua

Call custom c++ from Lua cocos2d-x lua binds c++ class, class functions ,enum and some global functions to lua through auto-binding by bindings-generator(tools/bindings-generator) and some manual binding,so we can call custom c++ from lua convenientl

Cocos2dx学习笔记5:场景(Scene)

场景(Scene)是游戏的直接表现元素,游戏是由若干不同的场景构建而成.游戏里面的关卡切换,地图切换实际就是游戏场景的切换.而这所有的流程都是Director来控制. 在项目中打开AppDelegate.cpp文件. 引用头文件#include "HelloWorldScene.h" auto scene = HelloWorld::createScene();//调用HelloWorld::createScene()创建场景 director->runWithScene(sce

Cocos2d-x学习笔记(三)“万物之父”——CCNode

原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38701767 通过前两份学习笔记,我们不难发现CCScene.CCLayer.CCSprite.CCAction等一系列元素都是CCNode的子类,但其实"万物之父"这个标题还是有点夸大,毕竟还有像CCDirector.CCCamera之类并不继承自CCNode的组件. 但是CCNode绝对是Cocos2d-x中举足轻重的一个核心,我们可以把它理解为节点.它

cocos2d-x lua脚本开发 1

自从开始关注OpenResty之后,逐渐关注Lua语言,发现这个语言真真是容易让人喜爱的语言.偶然间发现了cocos2d-x,还支持lua,所以果断尝试一下. 这里是在cocos2d-x官方网站下载了v2.2.3版本. 命令行中切换到解压后的COCOS2DX目录,切换到tools/project-creator,直接输入 python create_project.py 它就会告诉你有哪些参数,这里根据提示输入项目名和包名,在语言选项中选择lua就可以了,如 python create_proj

谈谈对quick-cocos2d-x和cocos2d-x lua的区别理解

在说之前,我还是把这个两个名词区分一下,毕竟太长,后面打起来肯定麻烦,quick-cocos2d-x就简称quick,cocos2d-x lua就姑且叫原生lua吧. 我觉得对于第一次接触这两个的小伙伴们肯定多多少少会跟我有一样的疑惑,这两个是使用两种不同的API吧.我只能说说对了一半,确实,quick有一套自己的API,但是,quick还是支持原生lua的api,就好比C和C++的关系,quick是一个超集. 还记得第一次打开quick主页的时候,那时候还没有被触控收购,就看到标题写到-- "

Cocos2d-x学习笔记(二)Cocos2d-x整体框架描述

原创文章,转载请注明出处:http://blog.csdn.net/sfh366958228/article/details/38680123 上一节我们简单分析了HelloWorld工程,这一讲我们将进一步来看看Cocos2d-x的整体框架. 在了解Cocos2d-x的整体框架之前,我们不妨想想拍摄一部电影需要些什么? 导演.舞台(场景).布景.演员,有了这些基本条件后,在这些元素都有了之后,演员就可以根据剧本,表现不同的动作行为. 同理,做一个游戏就像是拍摄一部电影,你同样需要这些元素,而C