您的位置:首页 > 移动开发 > Cocos引擎

关于cocos2dx下,图片数据的操作

2014-09-03 11:36 106 查看
在flash下,针对于图片的操作都是对位图数据的操作,读取改都很方便。 最近做一个小游戏,吃饼干, 大概内容就是一个完整的圆,点击到哪个点,那个点的附近都变成透明的。

对于这个功能,在flash下是相当轻松,但在cocos2dx下,就犯难了,因为cocos2dx下没有直接取到位置像素的数据。 查找资料之后,还是成功解决了问题,记录一下。感谢论坛上大侠的无私奉献。

原理是:ccsprite是构建之源是CCTexture2D , 而cctexture构建之源就是ccimage 。而ccimage的像素级数据可以根据ccimage的getdata方法可以得到。得到之后便可对之进行读写操作了, 可以实现碰撞检测和改变像素级的功能

取得某一张图片的数据可以通过如下方法。

CCImage* m_image;
unsigned char* m_data;
m_image = new
CCImage();
m_image->initWithImageFile(name);
//"cookies/cookies1.png"
m_data = m_image->getData();
此时,已取到像素数据

现在,我对这个数据进行每一像素的读取操作。这里只读取alpha通道,并判断是否是透明
for (unsigned
long hh=0; hh<m_image->getHeight(); hh++) {
for (unsigned
long i=0; i<m_image->getWidth(); i++) {
GLubyte byteValue = *(m_data+=3);
m_data++;
if (byteValue ==
0) {
//如果(i,hh)是透明,TODO
}
}
}

m_data-=m_image->getWidth()*m_image->getHeight()*4; //读完之后,别忘了对m_data的地址重置,以便后面操作。

写操作:对(x,y)位置像素点设为透明

float position = (y * m_image->getWidth() + x) * 4;
*(m_data+=(int(position)+3)) = 0;
m_data-=(int(position)+3);

写完之后需要更新显示的话。

CCTexture2D* texture = new
CCTexture2D();
texture->initWithData(m_data,
kCCTexture2DPixelFormat_RGBA8888, m_image->getWidth(),
m_image->getHeight(), CCSize(m_image->getWidth(),
m_image->getHeight()));
CCSprite *m_cakeSp =
CCSprite::createWithTexture(texture);
texture->release();

大概如此,其中的内存管理问题就不做记录了。 至此,个人觉得如果项目中频繁用到的话,得建立一个ImageDataManager来管理需要操作的图片数据,这样在data占用内存上会容易管理一些呢? 毕竟这个data对内存的占用是相当大的。 说归说,回头看看项目有没有对data进行释放了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐