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的触摸注册函数即可。
运行结果:
转载于:https://www.cnblogs.com/MiniHouse/p/3971566.html
cocos2d-x学习记录3——CCTouch触摸响应相关推荐
- 显示请求_学习记录:HTTP的响应与请求amp;Curl
本文包含四个部分,简要介绍HTTP请求.HTTP响应.chrome开发者查看.与CURL命令. Part1:HTTP请求 1GET请求指定的页面信息,并返回实体主体. 2HEAD类似于get请求,只不 ...
- 关于cocostudio动态添加控件触摸响应无效的学习
time:2015/04/19 1. 描述 * 把studio制作的ui加载之后,动态添加事件(比如说,单点触摸),结果回调函数(eg:onTouchBegan等)根本没有响应! * 另外,网上有朋友 ...
- JavaScript-WebAPIs学习记录
JavaScript-WebAPIs学习记录 浏览器交互效果 console.dir(); // 更好地查看里面的属性和方法 javascript:void(0); 或者 javascript:; 可 ...
- ASP.NETCore学习记录(一)
ASP.NETCore学习记录(一) asp.net core介绍 Startup.cs ConfigureServices Configure 0. ASP.NETCore 介绍 ASP.N ...
- Android开发技术周报176学习记录
Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...
- Redis的学习记录
Redis的学习记录 1.先导了解 1.1 NOSQL概述 1.1.1 为什么要用NoSql? 1.1.2 NoSql了解 1.1.3 NoSql特点 1.1.4 NoSQL的四大分类 2. Redi ...
- 架构与设计 之一 C 嵌入式设计模式(Design Patterns for Embedded Systems in C)的学习记录
唉 时至今日,已经不知道在嵌入式的道路上到底挣扎了多少个岁月,总感觉要"病入膏肓"了.此间总是不时出现一些疑惑:人家搞 Java.搞 C# 的动不动就是什么架构 / 框架的,搞 ...
- [学习记录] macOS下的Nginx安装 Nginx基本知识
[学习记录] macOS下的Nginx安装 && Nginx基本知识 一. 安装相关 1. 安装:直接通过brew安装即可 2. 启动: 3. 成功运行判断: 4. 改端口号:由于80 ...
- Java设计模式学习记录-单例模式
前言 已经介绍和学习了两个创建型模式了,今天来学习一下另一个非常常见的创建型模式,单例模式. 单例模式也被称为单件模式(或单体模式),主要作用是控制某个类型的实例数量是一个,而且只有一个. 单例模式 ...
- Django实现微信小程序九宫格切图后端(第九周学习记录)
第九周学习记录 上周第八周确实没有发布我的学习记录,因为服务器的原因项目也一直延迟,好在周日老师的服务器批下来,小伙伴也开始了快乐windows服务器配置,我自然也不能闲着,这周开始赶进度 一.小程序 ...
最新文章
- Java动态代理和静态代理区别
- Prokka:快速原核基因组、宏基因组基因注释
- AR普及后的未来是怎样的?
- Eclipse jee 配置Tomcat5.5
- MySql 里的IFNULL、NULLIF和ISNULL用法
- Object调用静态方法
- UNIX环境高级编程——Linux终端设备详解
- mysql8.0本机登录要1秒_Mysql8.0的登录大坑……(忘记登录密码也可以这么搞)
- php做姓名隐藏,PHP只显示姓名首尾字符,隐藏中间字符并用*替换
- Golang中闭包的理解
- 沙场白帽老兵聊未来的挖洞方向及其它
- css高度最小值,兼容IE6、7、8和FF
- 牛客网——判断上三角矩阵
- Qt 图片自适应QLabel大小
- 计算机混合运算java,大话Java混合运算规则
- android blowfish加密算法,blowfish 现在哪种加密算法安全?A
- django 标签verbatim的使用 200312
- APS高级计划排程系统,工厂各部门实施前后有哪些区别?
- 江恩 计算机,江恩计算器
- 深入理解synchronized