cocos2d-x学习记录3——CCTouch触摸响应

游戏不同于影音,强交互性是其一大特色,在游戏中主要体现为接受用户的输入并响应。智能手机触摸是其重要的输入方式。

在cocos2d-x中,触摸分为单点触摸和多点触摸。

单点触摸:主要继承CCTargetedTouchDelegate 实现。

多点触摸:主要继承CCStandardTouchDelegate实现。

MyScene.h

 1 #ifndef MyScene_H_H
 2 #define MyScene_H_H
 3
 4 #include "cocos2d.h"
 5 using namespace cocos2d;
 6
 7 class MyScene : public CCLayer
 8 {
 9 public:
10     static CCScene* createScene();
11     virtual bool init();
12     CREATE_FUNC( MyScene );
13
14     virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
15     virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
16     virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
17     virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
18
19     virtual void registerWithTouchDispatcher();
20
21
22 private:
23 };
24
25 #endif

MyScene.cpp

 1 #include "MyScene.h"
 2
 3 CCScene* MyScene::createScene()
 4 {
 5     CCScene *scene = CCScene::create();
 6     MyScene *layer = MyScene::create();
 7     scene->addChild(layer);
 8     return scene;
 9 };
10
11
12 bool MyScene::init()
13 {
14     if( !CCLayer::init() ){
15         return false;
16     }
17
18     CCSize size = CCDirector::sharedDirector()->getWinSize();
19     CCSprite *sprite = CCSprite::create("pal4.png");
20     sprite->setAnchorPoint( ccp(0.5, 0.5) );
21     //sprite->setPosition( ccp(size.width/2, size.height/2) );
22     sprite->setPosition( ccp(size.width/2, size.height/2) );
23     sprite->setScale(0.5f);
24     sprite->setTag(2345);
25     addChild(sprite);
26
27     setTouchEnabled(true);
28
29     return true;
30 }
31
32 bool MyScene::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
33 {
34     CCPoint point = pTouch->getLocationInView();
35     point = CCDirector::sharedDirector()->convertToGL(point);
36     CCNode *node = getChildByTag(2345);
37     float x = node->getPositionX();
38     float y = node->getPositionY();
39     float width = node->getContentSize().width*node->getScale();
40     float height = node->getContentSize().height*node->getScale();
41     //CCRect rect = CCRectMake(node->getPositionX()-node->getContentSize().width/2, node->getPositionY()-node->getContentSize().height/2,
42     //                        node->getContentSize().width, node->getContentSize().height);
43     CCRect rect = CCRectMake(x-width/2, y-height/2, width, height);
44
45     //CCLog("Touch start! %.1f,%.1f", point.x, point.y);
46     //CCMessageBox("start","info");
47     //return true;
48
49     if( rect.containsPoint(point) ){
50         CCLog("Touch start! %.1f,%.1f", point.x, point.y);
51         return true;
52     }
53
54     return false;
55 }
56
57 void MyScene::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
58 {
59     CCPoint point = pTouch->getLocation();
60     CCLog("Touch moved! %.1f,%.1f", point.x, point.y);
61 }
62
63 void MyScene::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
64 {
65     CCPoint point = pTouch->getLocation();
66     CCLog("Touch ended! %.1f, %.1f", point.x, point.y);
67 }
68
69 void MyScene::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)
70 {
71     CCPoint point = pTouch->getLocation();
72     CCLog("Touch canceled! %.1f, %.1f", point.x, point.y);
73 }
74
75 void MyScene::registerWithTouchDispatcher()
76 {
77     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
78 }

运行结果:

在TouchStart中,判断按下的点是否在图片显示区域内。如果在,则打出log,并返回true,然后CCTouchMove、CCTouchEnded等事件才会被响应;否则,不会响应。

Touches标准型。多点触摸时,会将所有的触摸点放进一个CCSet中。

 1 void MyScene::registerWithTouchDispatcher()
 2 {
 3     //CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
 4     CCLayer::registerWithTouchDispatcher();
 5 }
 6
 7
 8 void MyScene::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
 9 {
10     if( pTouches->count() == 1 ){
11         CCTouch *touch = (CCTouch*)(*( pTouches->begin() ));
12
13         CCPoint point = touch->getLocationInView();
14         point = CCDirector::sharedDirector()->convertToGL(point);
15         CCNode *node = getChildByTag(2345);
16         float x = node->getPositionX();
17         float y = node->getPositionY();
18         float width = node->getContentSize().width*node->getScale();
19         float height = node->getContentSize().height*node->getScale();
20         CCRect rect = CCRectMake(x-width/2, y-height/2, width, height);
21
22         //CCLog("Touches start! %.1f,%.1f", point.x, point.y);
23
24         if( rect.containsPoint(point) ){
25             CCLog("Touches start! %.1f,%.1f", point.x, point.y);
26         }
27     }
28
29     //return false;
30 }
31
32 void MyScene::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
33 {
34     if( pTouches->count() == 1 ){
35         CCTouch *touch = (CCTouch*)(*( pTouches->begin() ));
36         CCPoint point = touch->getLocationInView();
37         CCLog("Touches moved! %.1f,%.1f", point.x, point.y);
38     }
39 }
40
41 void MyScene::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
42 {
43     if( pTouches->count() == 1 ){
44         CCTouch *touch = (CCTouch*)(*( pTouches->begin() ));
45         CCPoint point = touch->getLocationInView();
46         CCLog("Touches ended! %.1f,%.1f", point.x, point.y);
47     }
48 }
49
50 void MyScene::ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent)
51 {
52     if( pTouches->count() == 1 ){
53         CCTouch *touch = (CCTouch*)(*( pTouches->begin() ));
54         CCPoint point = touch->getLocationInView();
55         CCLog("Touches canceled! %.1f,%.1f", point.x, point.y);
56     }
57 }

和标准CCTouch基本相同,只是在注册时,调用一次CCLayer的触摸注册函数即可。

运行结果:

时间: 2024-12-07 19:02:47

cocos2d-x学习记录3——CCTouch触摸响应的相关文章

Windows API 编程学习记录<三>

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

java学习记录(2):JMenuBar

1.在用这个时候发现很多的组件都有J的前缀,例如Button和JButton,前者是awt包的,后者是swing包的,两者耳朵区别是: AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口.AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers. 也就是说,当我们利用 AWT 来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库.由于不同操作系统的图形库所提供的功能

AndroidStudio学习记录

AndroidStudio学习记录 1. 插件的使用. plugins.jetbrains.com插件网站. 2. 目录介绍: 1.Studio中有Project和Module的概念,前面说到Studio中一个窗口只能有一个项目,即Project,代表一个workspace,但是一个Project可以包含多个Module,比如你项目引用的Android Library, Java Library等,这些都可以看做是一个Module; 2.上述目录中将java代码和资源文件(图片.布局文件等)全部

UWP学习记录7-设计和UI之控件和模式4

UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中进行浏览. 对于鼠标,导航按钮显示在鼠标悬停位置上. 对于键盘,使用箭头键移动浏览该集合. 翻转视图最适合浏览小到中型集合中的图像(最多 25 个项目左右). 此类集合的示例包括产品详细信息页中的项目或相册中的照片. 虽然微软不建议将翻转视图用于大多数大型集合,但是该控件通用于查看相册中的个别图像.

Angularjs 学习记录

1.Angular 所有的控件以及源码 https://github.com/angular 2.Angular api doc https://code.angularjs.org/1.2.9/docs/api 3.用AngularJS开发下一代Web应用(英文)下载 http://bestcbooks.com/angularjs-2013-4 AngularJS入门教程-v1.01-20130527.pdf http://ishare.iask.sina.com.cn/f/37141539.

UWP学习记录2-设计和UI之布局

UWP学习记录2-设计和UI之布局 1.导航基础知识 应用里,多个页面会有层次关系或者对等关系.这两种关系,通常在一个复杂应用里都会存在,而关系的选定依据: 对于对等导航,一般用选项卡(tabs)或者导航窗(nav)来作为导航元素实现导航跳转.而对于层次关系,则使用中心(hub)来提供子页面的预览或摘要,或者使用大纲(master-details)来实现导航. 除此之外,返回(后退)和链接也可以用来导航.启用系统后退导航支持的方法是注册 BackRequested 事件的侦听器.标题栏后退按钮的

quick-cocos2d-x 学习系列之十三 触摸

quick-cocos2d-x 学习系列之十三 触摸 现在智能机基本都是触摸屏,除了键盘爱好者们耍键盘.我们要通过这小小的触摸屏上完成整个游戏逻辑的控制,需要对这巴掌大地方进行详细控制了. 1.  单点触摸测试 创建精灵函数 function createTouchableSprite(p) local sprite = display.newScale9Sprite(p.image) sprite:setContentSize(p.size) local cs = sprite:getCont

UWP学习记录4-设计和UI之控件和模式1

UWP学习记录4-设计和UI之控件和模式1 1.控件和事件简介 在 UWP 应用开发中,控件是一种显示内容或支持交互的 UI 元素. 控件是用户界面的构建基块. 我们提供了超过 45 种控件供你使用,范围从简单按钮到网格视图之类的功能强大的数据控件. 模式是合并多个控件来创造新内容的一种方式. 应用添加控件实现UI,主要是三个步骤: A.将控件添加到你的应用 UI. B.设置控件的属性,如宽度.高度或前景色. C.将代码添加到控件的事件处理程序,从而使其执行一些任务. 添加应用一般通过: A.1

cocos2d-x学习记录-Tiled使用注意点

用Tiled新建 好地图后放到cocos2d上使用, // 加载Tiled地图 CCTMXTiledMap *map = CCTMXTiledMap::create("birdMap.tmx"); this->addChild(map); 然后报如下错误 Assert failed: TMX: Only 1 tileset per layer is supported 原来是我把多个图块上的元素,都画到一个块层上,一个块层只能包含一个图块的元素, 新建不同块层安放其它图块元素,就