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

在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的触摸注册函数即可。

运行结果:

转载于:https://www.cnblogs.com/MiniHouse/p/3971566.html

cocos2d-x学习记录3——CCTouch触摸响应相关推荐

  1. 显示请求_学习记录:HTTP的响应与请求amp;Curl

    本文包含四个部分,简要介绍HTTP请求.HTTP响应.chrome开发者查看.与CURL命令. Part1:HTTP请求 1GET请求指定的页面信息,并返回实体主体. 2HEAD类似于get请求,只不 ...

  2. 关于cocostudio动态添加控件触摸响应无效的学习

    time:2015/04/19 1. 描述 * 把studio制作的ui加载之后,动态添加事件(比如说,单点触摸),结果回调函数(eg:onTouchBegan等)根本没有响应! * 另外,网上有朋友 ...

  3. JavaScript-WebAPIs学习记录

    JavaScript-WebAPIs学习记录 浏览器交互效果 console.dir(); // 更好地查看里面的属性和方法 javascript:void(0); 或者 javascript:; 可 ...

  4. ASP.NETCore学习记录(一)

    ASP.NETCore学习记录(一) asp.net core介绍  Startup.cs  ConfigureServices  Configure  0. ASP.NETCore 介绍 ASP.N ...

  5. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  6. Redis的学习记录

    Redis的学习记录 1.先导了解 1.1 NOSQL概述 1.1.1 为什么要用NoSql? 1.1.2 NoSql了解 1.1.3 NoSql特点 1.1.4 NoSQL的四大分类 2. Redi ...

  7. 架构与设计 之一 C 嵌入式设计模式(Design Patterns for Embedded Systems in C)的学习记录

    唉   时至今日,已经不知道在嵌入式的道路上到底挣扎了多少个岁月,总感觉要"病入膏肓"了.此间总是不时出现一些疑惑:人家搞 Java.搞 C# 的动不动就是什么架构 / 框架的,搞 ...

  8. [学习记录] macOS下的Nginx安装 Nginx基本知识

    [学习记录] macOS下的Nginx安装 && Nginx基本知识 一. 安装相关 1. 安装:直接通过brew安装即可 2. 启动: 3. 成功运行判断: 4. 改端口号:由于80 ...

  9. Java设计模式学习记录-单例模式

    前言 已经介绍和学习了两个创建型模式了,今天来学习一下另一个非常常见的创建型模式,单例模式. 单例模式也被称为单件模式(或单体模式),主要作用是控制某个类型的实例数量是一个,而且只有一个. 单例模式 ...

  10. Django实现微信小程序九宫格切图后端(第九周学习记录)

    第九周学习记录 上周第八周确实没有发布我的学习记录,因为服务器的原因项目也一直延迟,好在周日老师的服务器批下来,小伙伴也开始了快乐windows服务器配置,我自然也不能闲着,这周开始赶进度 一.小程序 ...

最新文章

  1. Java动态代理和静态代理区别
  2. Prokka:快速原核基因组、宏基因组基因注释
  3. AR普及后的未来是怎样的?
  4. Eclipse jee 配置Tomcat5.5
  5. MySql 里的IFNULL、NULLIF和ISNULL用法
  6. Object调用静态方法
  7. UNIX环境高级编程——Linux终端设备详解
  8. mysql8.0本机登录要1秒_Mysql8.0的登录大坑……(忘记登录密码也可以这么搞)
  9. php做姓名隐藏,PHP只显示姓名首尾字符,隐藏中间字符并用*替换
  10. Golang中闭包的理解
  11. 沙场白帽老兵聊未来的挖洞方向及其它
  12. css高度最小值,兼容IE6、7、8和FF
  13. 牛客网——判断上三角矩阵
  14. Qt 图片自适应QLabel大小
  15. 计算机混合运算java,大话Java混合运算规则
  16. android blowfish加密算法,blowfish 现在哪种加密算法安全?A
  17. django 标签verbatim的使用 200312
  18. APS高级计划排程系统,工厂各部门实施前后有哪些区别?
  19. 江恩 计算机,江恩计算器
  20. 深入理解synchronized

热门文章

  1. Gedit汇编语法高亮设置
  2. 【android错误】bitmap size exceeds 32bits
  3. 如何利用开源风控系统 TH-Nubula(星云)防止撞库?
  4. Linux-mysql备份
  5. PostgreSQL Logical Replication
  6. zabbix源分支---zabbix-rpm
  7. 基于redis集群实现的分布式锁,可用于秒杀,定时器。
  8. Git学习(2)Git 安装
  9. TCP加速机制是如何加速的?
  10. Ubuntu18.04 关闭和开启图形界面