【Cocos2dx 3.3 Lua】触屏事件

cocos2dx 3.x触屏时间分为单点触摸和多点触摸:

单点触摸:(即只有注册的Layer才能接收触摸事件)

多点触摸点单用法(多个Layer获取屏幕事件)

1、单点触摸

1.1 基本函数

onTouchBegan   

如果返回true:本层的后续Touch事件可以被触发,并阻挡向后层传递

如果返回false,本层的后续Touch事件不能被触发,并向后传递,也就是不会调用

onTouchMoved

简单点来说,如果:

1.Layer 只有一层的情况:


1

virtual bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

a.返回false,则ccTouchMoved(),ccTouchEnded()不会再接收到消息

b.返回true,则ccTouchMoved(),ccTouchEnded()可以接收到消息

2.Layer 有多层的情况:


1

virtual bool onTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

a.返回false,则本层的onTouchMoved(),onTouchEnded()不会再接收到消息,但是本层之下的其它层会接收到消息

b.返回true,则本层的onTouchMoved(),onTouchEnded()可以接收到消息,但是本层之下的其它层不能再接收到消息

1.2 使用示例

在Layer中添加如下代码,并重载onTouchxxx函数

ps:

listener->setSwallowTouches(true),不向下触摸,简单点来说,比如有两个sprite ,A 和 B,A在上B在下(位置重叠),触摸A的时候,B不会受到影响;

listener->setSwallowTouches(false)反之,向下传递触摸,触摸A也等于触摸了B;

Cocos2dx Lua 单点触摸事件

Link: http://codepad.org/WqK2Sqak    [ raw code | fork ]  
local BaseMap=class("BaseMap",function()
    return cc.Layer:create()
end)

BaseMap.init=function(self)
    self._size=cc.Director:getInstance():getVisibleSize()
    self._mapres=""
    self._level=0
end

BaseMap.setTouchEnable=function(self,enable)
    local function onTouchBegin(touch, event)
        self:onTouchBegin(touch:getLocation())
    end

    local function onTouchEnd(touch, event)
        self:onTouchEnd(touch:getLocation())
    end

    if enable == true then
        local listener = cc.EventListenerTouchOneByOne:create()
        listener:registerScriptHandler(onTouchBegin,cc.Handler.EVENT_TOUCH_BEGAN )
        listener:registerScriptHandler(onTouchEnd,cc.Handler.EVENT_TOUCH_ENDED )
        local eventDispatcher = self:getEventDispatcher()
        eventDispatcher:addEventListenerWithSceneGraphPriority(listener, self)
    end
end

BaseMap.onTouchBegin=function(self,touch)

end

BaseMap.onTouchEnd=function(self,touch)

end

return BaseMap

2、多点触摸

注意:

多点触摸,onTouchsBegan函数的参数和返回值与单点触摸的参数和返回值的差异

3、eventDispatcher

_eventDispatcher 是 Node 的属性,通过它管理当前节点(如 场景 、层、精灵等 )的所有事件分发情况。但是它本身是一个单例模式值的引用,在 Node 构造函数中,通过 "Director::getInstance()>getEventDispatcher();" 获取,有了这个属性,我们能更为方便的调用。

3.1 获取方法

3.2 事件监听类型

事件监听器包含以下几种:

  • 触摸事件 (EventListenerTouch)
  • 键盘响应事件 (EventListenerKeyboard)
  • 加速记录事件 (EventListenerAcceleration)
  • 鼠标响应事件 (EventListenerMouse)
  • 自定义事件 (EventListenerCustom)

以上事件监听器统一由 _eventDispatcher 来进行管理。

3.3 优先权

1.优先级越低,越先响应事件

2.如果优先级相同,则上层的(z轴)先接收触摸事件

有两种方式将 事件监听器 listener 添加到 事件调度器_eventDispatcher 中:

addEventListenerWithSceneGraphPriority实现:

addEventListenerWithFixedPriority实现:

注意:

(1)addEventListenerWithSceneGraphPriority 的事件监听器优先级是0,而且在 addEventListenerWithFixedPriority 中的事件监听器的优先级不可以设置为 0,因为这个是保留给 SceneGraphPriority 使用的。这里当我们再次使用 listener 的时候,需要使用 clone() 方法创建一个新的克隆,因为在使用 addEventListenerWithSceneGraphPriority 或者 addEventListenerWithFixedPriority 方法时,会对当前使用的事件监听器添加一个已注册的标记,这使得它不能够被添加多次。

clone实现:

(2)另外,有一点非常重要,FixedPriority listener添加完之后需要手动remove,而SceneGraphPriority listener是跟node绑定的,在node的析构函数中会被移除。

addEventListenerWithFixedPriority  listener 移除方法:


1

dispatcher->removeEventListener(listener);

时间: 2024-08-12 05:00:27

【Cocos2dx 3.3 Lua】触屏事件的相关文章

cocos2dx触屏事件详解

版本:2.x 平台iso 先看mian.m文件 //创建一个iso应用 int retVal = UIApplicationMain(argc, argv, nil, @"AppController"); iOS系统会调用AppController 的 didFinishLaunchingWithOptions函数,里面做了一些创建界面的东西 该函数内部有如下代码: cocos2d::CCApplication::sharedApplication()->run(); 注:*.m

【COCOS2D-X 备注篇】cocos2dx 获取手机截屏等意外取消触屏事件的处理方法!

最近有童鞋问我如何获取到iphone手机截屏的事件,所以本篇就简单的聊下这种问题的处理办法. 在cocos2dx引擎中,我们能在AppDelegate中获取到,用户将应用切入后台,以及重新返回应用的事件函数.那么对应的,cocos2dx也在引擎中给予我们截取屏幕等这种只能手机应有事件的处理函数. 其实大家应该都很熟悉截取用户触屏的函数,如下: 1 2 3 4 // default implements are used to call script callback if exist virtu

触屏事件

iphone ipad开发: 关于触屏事件的一些操作 [cpp] view plaincopyprint? //轻击: //需要在你的ViewController里重写几个方法: //开始触摸的方法 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { messageLabel.text = @”Touches Began”; [self updateLabelsFromTouches:touches]; } //触

Android的触屏事件

Android系统中的每个View的子类都包含的三种和touchevent有关的三种方法. ondispathTouchEvent(); 这个方法用来分发TouchEventonInterceptTouchEvent(); 这个方法用来拦截TouchEventonTouchEvent: 这个方法用来处理TouchEvent 每次触屏事件,都有最顶层的View的ondispathTouchEvent()接受,由这个方法进行分发.当方法返回true时 ,就将触屏事件传递给该View的OntouchE

移动端touch触屏滑动事件、滑动触屏事件监听!

移动端touch触屏滑动事件.滑动触屏事件监听! 一.触摸事件 ontouchstart.ontouchmove.ontouchend.ontouchcancel 目前移动端浏览器均支持这4个触摸事件,包括IE.由于触屏也支持MouseEvent,因此他们的顺序是需要注意的:touchstart → mouseover → mousemove → mousedown → mouseup → click1 Apple在iOS 2.0中引入了触摸事件API,Android正迎头赶上这一事实标准,缩小

Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发

Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发 做项目的时候经常遇到需要事件分发,很多时候我们发现当我们触发了onTouch却触发不了onClick.或者触发了View的事件却触发不了ViewGroup的事件.那么他们之间到底是什么关系呢,其实最终他们涉及的只是两个问题 OnTouch .onClick .onTouchEvent 之间的关系 OnTouch .onClick .onTouchEvent 之间的处理顺序 这里,我做了简单

View实现事件监听DEMO(文本跟随触屏事件)

View 是一个显示的视图,内置的画布通过重写Ondraw(Canvas canvas);方法获得,同时提供图形绘制函数.触屏事件.按键事件等. 现在利用一个简单的demo演示一下几个重要的常用到的方法: import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.view.K

html5之移动触屏事件

HTML5的javascript touch事件 HTML5+CSS3, javascript Add comments 四282013 以下是几种普及得比较好的触摸事件,可以在绝大多数现代浏览器中来测试这一事件(必须是触屏设备): (on)touchstart:触摸开始的时候触发 (on)touchmove:手指在屏幕上滑动的时候触发 (on)touchend:触摸结束的时候触发 (on)touchcancel:系统取消touch事件的时候触发.例如电话接入或者弹出信息.一般用在游戏:玩着的时

25.Unity3D手机中Input类touch详解-Unity触屏事件解析到底(Twisted Fate)

首先贴一下Unity支持的模型文件类型,以前没有收集过. Unity支持两种类型的3D文件格式: 1.  通用的"出口型"3D文件 如.fbx..dae..3ds..dxf..obj等文件格式. 2.  3D软件专用的3D文件格式 如Max, Maya, Blender,Cinema4D, Modo, Lightwave & Cheetah3D 等软件所支持的格式,如.MAX, .MB, .MA等等. Unity3D手机中Input类touch详解: 1.Input.touch

android实现横竖屏8个方向触屏事件的捕捉并有相对应的动画提示

1:首先来说横竖屏的问题 这里我是在onCreate方法中直接强制横屏竖屏的设置, Button btn; SurfaceView surfaceView; //初始化布局 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); addListener(); } //初始化 pri