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

在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进行释放了。










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值