06--触摸事件响应

Cocos2DX提供了加速度计和触屏的支持,两种操作方式为我们带来了不少新的乐趣。Cocos2DX对触屏的支持采用了事件驱动的方式:

上图反映了引擎在处理触屏的原理,目前的状况并不适合深入的原理性的东西。所有今天主要还是看看作为开发者如何响应触屏事件,首先看看引擎准备的函数


//CCLayer.h
// default implements are used to call script callback if exist
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);

// default implements are used to call script callback if exist
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);


从CCLayer定义的接口来看,不难发现Cocos2DX支持单点和多点触摸操作,而多点触摸也能实现单点触摸操作的效果。上面的接口让我想起了WinFrom中支持拖拽操作的控件,需要响应拖拽开始、拖拽过程、拖拽结束。

废话了,使用向导新建一个工程TouchDemo,然后删除菜单等相关代码,并复制ball.png图片到资源目录。HelloWorldScene.h中添加命名空间,添加需要重载的接口


#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

using namespace cocos2d;

class HelloWorld : public cocos2d::CCLayer
{
public:
// Here‘s a difference. Method ‘init‘ in cocos2d-x returns bool, instead of returning ‘id‘ in cocos2d-iphone

static cocos2d::CCScene* scene();

// a selector callback
void menuCloseCallback(CCObject* pSender);
public:
virtual bool init();

//触屏开始事件
virtual void ccTouchesBegan (CCSet *pTouches, CCEvent *pEvent);
//触屏移动事件
virtual void ccTouchesMoved (CCSet *pTouches, CCEvent *pEvent);
//触屏结束事件
virtual void ccTouchesEnded (CCSet *pTouches, CCEvent *pEvent);

CREATE_FUNC(HelloWorld);
};

#endif // __HELLOWORLD_SCENE_H__

然后修改HelloWorldScene.cpp中的init函数如下:


bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}

//开启多点触摸
setTouchEnabled(true);

CCSprite* pSprite = CCSprite::create("ball.png");
pSprite->setPosition(ccp(100,200));
addChild(pSprite,0 , 88);
return true;
}

实现触屏操作,这里实现的功能是精灵根据移动到触摸点。这个功能重载ccTouchesMoved
函数即可,在开始和结束事件中输出触点坐标。


void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
CCSetIterator iter = pTouches->begin();
for (; iter!=pTouches->end(); iter++) {
CCTouch * pTouch=(CCTouch * )(* iter);
CCPoint loaction = pTouch->getLocation();
CCLog("pTouch start :x=%f , y=%f",loaction.x ,loaction.y);
}
}
void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
CCSetIterator iter = pTouches->begin();
for (; iter!=pTouches->end(); iter++) {
CCTouch * pTouch = (CCTouch * )(* iter);
CCPoint location = pTouch->getLocation();

CCSprite * pSprite = (CCSprite* )this->getChildByTag(88);
pSprite->setPosition(location);
}
}
void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
CCSetIterator iter = pTouches->begin();
for (; iter!=pTouches->end(); iter++) {
CCTouch * pTouch=(CCTouch * )(* iter);
CCPoint loaction = pTouch->getLocation();
CCLog("pTouch end :x=%f , y=%f",loaction.x ,loaction.y);
}
}

最后运行程序(上了一个静态图,还不会做动态图

后记:不是在Cocos2DX官方解决方案中添加项目可能会出现访问冲突错误,我在写代码过程中也遇到此问题,期初以为自己代码写错了,后来想起[转]Cocos2d-x建工程时避免copy文件夹和库回复中提到这个方案并不完美,然后将相关的dll复制到本项目中就OK。

时间: 2024-12-16 18:46:14

06--触摸事件响应的相关文章

touches,motion触摸事件响应

//触摸事件响应需要重写方法 1 // 触摸时触发该方法(消息发送) 2 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ 3 UITouch *touch = [touches anyObject]; 4 CGPoint point = [touch locationInView:self.rootView.touchView];//locationInView:得到当前点击下在指定视图中

UIResponder 类中的触摸事件响应方法

touchesBegan:withEvent:-当触摸事件处于"起步阶段"(starting phase),也就是用户刚开始触碰屏幕时,系统会调用这个方法. touchesMoved:withEvent:-当用户触摸屏幕并持续在屏幕上移动手指时,系统会调用这个方法. touchesEnded:withEvent:-当用户触摸屏幕的一根手指或所有手指都从屏幕上拿开时,触摸过程就结束了,而系统此时会调用这个方法.如果在用户移动手指的过程中程序做了一些处理,那么此时应该会执行相关的清理工作.

Cocos2d-x中触摸事件

理解一个触摸事件可以从时间和空间两方面考虑. 1.触摸事件的时间方面 触摸事件的在时间方面,如下图所示,可以有不同的"按下"."移动"和"抬起"等阶段,表示触摸是否刚刚开始.是否正在移动或处于静止状态,以及何时结束,也就是手指何时从屏幕抬起.此外,触摸事件的不同阶段都可以有单点触摸或多点触摸,是否支持多点触摸还要看设备和平台. 触摸事件有两个事件监听器:EventListenerTouchOneByOne和EventListenerTouchAl

Android自定义控件系列 十:利用添加自定义布局来搞定触摸事件的分发,解决组合界面中特定控件响应特定方向的事件

这个例子是比较有用的,基本上可以说,写完这一次,以后很多情况下,直接拿过来addView一下,然后再addInterceptorView一下,就可以轻轻松松的达到组合界面中特定控件来响应特定方向的触摸事件了. 请尊重原创劳动成果,转载请注明出处:http://blog.csdn.net/cyp331203/article/details/45198549,非允许请勿用于商业或盈利用途,违者必究. 在写Android应用的过程之中,经常会遇到这样的情况:界面包含了多个控件,我们希望触摸在界面上的不

iOS中的触摸事件(TouchView) - (代理响应) - (实现touch的按钮化)

#import "RootViewController.h" #import "ActionView.h" #import "UIColor+MyUIColor.h" @interface RootViewController () @end @implementation RootViewController - (void)viewDidLoad { [super viewDidLoad]; //self指的是当前对象 RootViewCon

cocos2dx3.x使用cocostudio触摸事件不响应的奇葩问题

刚刚使用3.1,发现了一些关于触摸的不同之处,对于习惯于2.x的人还是觉得坑啊,简单总结一下: 使用cocostudio加进来的ui,当某个可触但不可见的时候,给他添加任何触摸监听事件都是按照不可触处理的,真心感觉太坑了!  //白白原创 给某一个层的某一个精灵绑定触摸之后,移除该层,但是触摸还在,应该也做移除 _eventDispatcher->removeEventListener(touchListener); touchListener = nullptr; _eventDispatch

UI和3D场景同时都需要响应触摸事件

比如战斗场景,UI和3D场景同时都需要响应触摸事件,如果同时响应可能就会出现触摸UI的时候影响到了3D部分.为了解决这个问题在判断3D响应之前要先判断手指是否点击在UI上. 以前NGUI的时候都是自己来发送射线判断,现在UGUI好了系统提供了更为简便的方法. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #if UNITY_AN

(转)使用OpenGL显示图像(六)响应触摸事件

响应触摸事件 编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/touch.html 让对象根据预设的程序运动(如让一个三角形旋转),可以有效地引起用户的注意,但是如果希望让OpenGL ES的图形对象与用户交互呢?让我们的OpenGL ES应用可以支持触控交互的关键点在于,拓展GLSurfaceView的实现,重写onTouchEvent()方法来监听触摸事件. 这节课将会向你展示如何监听触控事件,让用户旋转

Android官方开发文档Training系列课程中文版:OpenGL绘图之响应触摸事件

原文地址:http://android.xsoftlab.net/training/graphics/opengl/touch.html 使图形按照程序设计的轨迹旋转对OpenGL来说还是不能发挥出它应有的实力.但要是能使用户可以直接控制图形的旋转,这才是OpenGL的真正目的.它真正的关键所在就是使程序可以交互式触摸.这主要靠重写GLSurfaceView的onTouchEvent()的方法来实现触摸事件的监听. 这节课将会展示如何监听触摸事件来使用户可以旋转图形. 设置触摸监听器 为了可以使

react-native 手势响应以及触摸事件的处理

react-native 的触摸事件: TouchableHighlight , TouchableNativeFeedBack , TouchableOpacity , TouchableWithoutFeedBack. 在onPress事件触发的函数中都会携带事件参数(event)包含一个参数 :nativeEvent 参数如下 locationX 和 locationY 是触摸的位置相对于组件的位置 pageX 和 pageY 是触摸的位置相对于屏幕的位置 timestamp 是时间戳 手