文档章节

cocos2d-x像素级触摸处理

piggybear
 piggybear
发布于 2015/02/16 10:28
字数 856
阅读 12
收藏 1
点赞 0
评论 0

最近研究了一下像素级的触摸处理,有时候我们用一个不规则的图形作为一个按钮,这个不规则的图形是一张矩形的png图片,很可能图片的实际有效的显示内容只占整个png图片的很小一部分,剩下的大部分都是png图片的透明区域,我们想把这部分透明区域过滤掉,实现一个触摸到真实的内容才会有按钮响应的效果。

刚开始试图通过CCSprite直接获取到纹理的像素信息,但是cocos2d-x并没有给我们提供直接通过CCSprite获取像素信息的接口,研究了几个网上的Demo,发现通过使用RenderTexture重绘可以实现这一效果,下面把代码贴出来。

[cpp]  view plain copy
  1. #include "HelloWorldScene.h"  
  2. #include "SimpleAudioEngine.h"  
  3.   
  4. using namespace cocos2d;  
  5. using namespace CocosDenshion;  
  6.   
  7. CCScene* HelloWorld::scene()  
  8. {  
  9.     // 'scene' is an autorelease object  
  10.     CCScene *scene = CCScene::create();  
  11.       
  12.     // 'layer' is an autorelease object  
  13.     HelloWorld *layer = HelloWorld::create();  
  14.   
  15.     // add layer as a child to scene  
  16.     scene->addChild(layer);  
  17.   
  18.     // return the scene  
  19.     return scene;  
  20. }  
  21.   
  22. bool HelloWorld::init()  
  23. {  
  24.     if (!CCLayer::init()){  
  25.         return false;  
  26.     }  
  27.       
  28.     this->setTouchEnabled(true);  
  29.   
  30.     this->m_imgMan = CCSprite::create("man.png");  
  31.     this->m_imgMan->setPosition(ccp(400, 200));  
  32.     this->addChild(this->m_imgMan, 1);  
  33.       
  34.     this->m_pRenderTexture = CCRenderTexture::create(this->m_imgMan->getContentSize().width, this->m_imgMan->getContentSize().height, kCCTexture2DPixelFormat_RGBA8888);  
  35.     this->m_pRenderTexture->ignoreAnchorPointForPosition(true);  
  36.     this->m_pRenderTexture->setPosition(ccp(400, 200));  
  37.     this->m_pRenderTexture->setAnchorPoint(CCPointZero);  
  38.     this->addChild(this->m_pRenderTexture, 0, 1);  
  39.   
  40.       
  41.     return true;  
  42. }  
  43.   
  44. bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) {  
  45.       
  46.     bool isTouched = false;  
  47.       
  48.     CCPoint touchPoint = pTouch->getLocationInView();  
  49.     CCPoint glPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);  
  50.   
  51.   
  52.     if (this->m_imgMan->boundingBox().containsPoint(glPoint)) {  
  53.       
  54.         ccColor4B color4B = {0, 0, 0, 0};  
  55.           
  56.         CCPoint nodePos = this->m_imgMan->convertTouchToNodeSpace(pTouch);  
  57.         unsigned int x = nodePos.x;  
  58.         unsigned int y = this->m_imgMan->getContentSize().height - nodePos.y;  
  59.           
  60.         CCPoint point = this->m_imgMan->getPosition();  
  61.         //开始准备绘制  
  62.         this->m_pRenderTexture->begin();  
  63.         //绘制使用的临时精灵,与原图是同一图片  
  64.         CCSprite* pTempSpr = CCSprite::createWithSpriteFrame(this->m_imgMan->displayFrame());  
  65.         pTempSpr->setPosition(ccp(pTempSpr->getContentSize().width / 2, pTempSpr->getContentSize().height / 2));  
  66.         //绘制  
  67.         pTempSpr->visit();  
  68.         //结束绘制  
  69.         this->m_pRenderTexture->end();  
  70.         //通过画布拿到这张画布上每个像素点的信息,封装到CCImage中  
  71.         CCImage* pImage = this->m_pRenderTexture->newCCImage();  
  72.         //获取像素数据  
  73.         unsigned char* data_ = pImage->getData();  
  74.         unsigned int *pixel = (unsigned int *)data_;  
  75.         pixel = pixel + (y * (int)pTempSpr->getContentSize().width) * 1 + x * 1;  
  76.         //R通道  
  77.         color4B.r = *pixel & 0xff;  
  78.         //G通道  
  79.         color4B.g = (*pixel >> 8) & 0xff;  
  80.         //B通过  
  81.         color4B.b = (*pixel >> 16) & 0xff;  
  82.         //Alpha通道,我们有用的就是Alpha  
  83.         color4B.a = (*pixel >> 24) & 0xff;  
  84.           
  85.         CCLOG("当前点击的点的: alpha = %d", color4B.a);  
  86.           
  87.         if (color4B.a > 50) {  
  88.             isTouched = true;  
  89.         } else {  
  90.             isTouched = false;  
  91.         }  
  92.           
  93.         //绘制完成后清理画布的内容  
  94.         this->m_pRenderTexture->clear(0, 0, 0, 0);  
  95.     }  
  96.       
  97.       
  98.     if (this->m_pLabTips) {  
  99.         this->m_pLabTips->removeFromParentAndCleanup(true);  
  100.         this->m_pLabTips = NULL;  
  101.     }  
  102.       
  103.     return isTouched;  
  104. }  
  105.   
  106.   
  107. void HelloWorld::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) {  
  108.       
  109.     if (this->m_pLabTips) {  
  110.         this->m_pLabTips->removeFromParentAndCleanup(true);  
  111.         this->m_pLabTips = NULL;  
  112.     }  
  113.       
  114.     this->m_pLabTips = CCLabelTTF::create("点击到非透明的像素点""Courier", 30);  
  115.     this->m_pLabTips->setAnchorPoint(CCPointZero);  
  116.     this->m_pLabTips->setPosition(ccp(300.0f, 100.0f));  
  117.     this->m_pLabTips->setColor(ccYELLOW);  
  118.     this->addChild(this->m_pLabTips, 1);  
  119.   
  120. }  
  121.   
  122. void HelloWorld::registerWithTouchDispatcher() {  
  123.     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, CCLayer::getTouchPriority(), false);  
  124. }  
当点击到了有色点时,我让屏幕上显示黄字提示,并观察打印日志信息:



当点击到了透明的黑色区域时,屏幕上不显示任何文字,观察打印日志信息:



实现的原理:我通过点击的时候把图片进行重绘,重绘的过程中,可以通过RenderTexture也就是画布,把整个画布上的像素点信息全部拿到,我让绘制的内容和画布的大小是一样的,所以就能保证画布上的每一个像素点就是我想要绘制的图片的像素点,然后通过判断像素点的alpha通道值,来确定这个点是否是透明色的,如果是透明色则不做触摸响应。



本文转载自:http://blog.csdn.net/aa294194253/article/details/38701893

共有 人打赏支持
piggybear
粉丝 3
博文 237
码字总数 37552
作品 0
西安
技术主管
忍者无敌-实例讲解Cocos2d-x瓦片地图

实例比较简单,如图所示,地图上有一个忍者精灵,玩家点击他周围的上、下、左、右,他能够向这个方向行走。当他遇到障碍物后是无法穿越的,障碍物是除了草地以为部分,包括了:树、山、河流等...

智捷课堂
2014/09/19
0
1
实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D

我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用。这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在...

智捷课堂
2014/10/08
0
0
Cocos2d-JS事件处理机制

在很多图形用户技术中,事件处理机制一般都有三个重要的角色:事件、事件源和事件处理者。事件源是事件发生的场所,通常就是各个视图或控件,事件处理者是接收事件并对其进行处理的一段程序。...

智捷课堂
2015/03/31
0
0
(翻译)使用Cocos2D 2.X制作一个简单iPhone游戏教程——第1部分

原文地址:http://www.raywenderlich.com/25736/how-to-make-a-simple-iphone-game-with-cocos2d-2-x-tutorial Ray要说:经过一周的投票表决,大家希望我将此套Cocos2D经典入门系列教程从Coc...

长平狐
2013/12/26
140
0
9秒分享 Cocos2d-X2.2版本框架源码分析第二讲

接着最开始的,我们继续来分析Cocos2d-x的框架源码 接下来,我们来玩什么呢? 对了,定时器..我们现在开始..刚才多少来着,哦,对了,第四个了..我们开始 4cocos2d-x定时器机制 问题1:定时器...

扶殊88
2014/04/01
0
0
十 手游开发神器 cocos2d-x editor 之触摸事件

这一节 我将实现让小怪物跟随我的触摸方向移动,同时触摸的地方产生一个四周发散的效果 效果如下: 代码下载:http://www.kuaipan.cn/file/id25348935635744782.htm?source=1 打开MainLayer...

makeapp628
2014/01/25
0
0
(翻译)介绍Box2D的Cocos2D 2.X教程:弹球

原文地址:http://www.raywenderlich.com/28602/intro-to-box2d-with-cocos2d-2-x-tutorial-bouncing-balls 译文更新:2013-04-27 更新内容: 将body统一译为刚体 将fixture统一译为夹具 更新...

长平狐
2013/12/26
248
0
COCOS2DX 3.X 解决TABLEVIEW 、SCROLLVIEW上的MENU问题

本站文章均为 罗汉果 cocos2d-x技术博客 原创,转载务必在明显处注明: 转载自 【罗汉果 cocos2d-x技术博客】 原文链接: http://tech.pigsns.com/thread-228-1-1.html 问题有两个(我主要解决...

汉果James
2014/08/27
0
2
cocos2d-CCDirector分析

CCDirector负责创建和处理主窗口,和管理场景的的执行。同时负责: 初始化OpenGL ES的context 设置OpenGL像素格式(默认是RGB565) 设置OpenGL缓冲深度(默认是0-bit) 设置投影模式(默认是...

andyhe91
2013/09/04
0
0
cocos2d-x学习笔记(三)解决cocos2d::Director没有成员getTouchDispatcher问题

初学者在学习代码阶段偶尔会把项目代码拿过来编译,然后看下运行结果再研究代码。如果别人的项目代码是用cocos2d-x 3.0之前的版本编写的,而自己用的cocos2d-x是3.0以后的,编译的时候经常会...

wty530
2015/08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python解析配置文件模块:ConfigPhaser

import configparser as pa # [SectionA] # a = aa # b = bb # c = cc # [SectionB] # optionint = 1 # optionfloat = 1.1 # optionstring = string #https://www.cnblogs.com/anpengapple/p......

易野
1分钟前
0
0
Java基础——面向对象

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Object的方法: clone() Object 克隆 to Strin...

凯哥学堂
3分钟前
0
0
rabbitmq学习记录(八)消息发布确认机制

RabbitMQ服务器崩了导致的消息数据丢失,已经持久化的消息数据我们可以通过消息持久化来预防。但是,如果消息从生产者发送到vhosts过程中出现了问题,持久化消息数据的方案就无效了。 Rabbit...

人觉非常君
8分钟前
0
0
毕业5年,我是怎么成为年薪30W的运维工程师

#转载# 我在大学读的是计算机专业,但大学毕业之后,进入到一家私企进行工作,工作的内容类似于网管,会经常的去修电脑,去做水晶头等内容。刚开始工作,也没想太多,最想的是丰富自己的工作...

Py爱好
15分钟前
0
0
大数据基础知识,大数据学习,涉及的知识点

一、什么是大数据 一种规模大到在获取、存储、管理、分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模、快速的数据流 转、多样的数据类型和价值密度低四大特征。...

董黎明
30分钟前
0
0
Linux CentOS 7上安装极点五笔

话说几天前在新买的惠普笔记本上成功地安装了Linux CentOS 7操作系统、Nvidia Quandro P600驱动程序及X Window,并在VMware下安装Red Hat教学环境,彻底跳出Windows的苦海,但仍然有一件事不...

大别阿郎
43分钟前
10
0
2018年7月20日集群课程

一、集群介绍 集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。 ...

人在艹木中
45分钟前
0
0
spark开发机中调试snappy

目的 在Idea中的点击运行,使spark可以直接读取snappy 自己编译hadoop,以支持snappy的压缩。 自己编译的目的就是要得到支持snappy文件读写的动态链接库。如果可以在网上下载,可以跳过自行编...

benny周
今天
0
0
centos7 安装docker

1,查看系统版本 cat /etc/redhat-release 2,安装gcc yum -y install gccyum -y install gcc-c++ 3,卸载旧版本 yum remove docker \ docker-client \ ......

暗中观察
今天
0
0
[译]为什么(要使用)GNU Affero GPL?

#为什么(要使用)GNU Affero GPL? 作者信息:Copyright © 2010, 2013, 2014, 2015 Free Software Foundation, Inc. This page is licensed under a Creative Commons Attribution-NoDeriv......

ICE冰焰火灵X
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部