关于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进行释放了。
对于这个功能,在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进行释放了。
相关文章推荐
- 关于BMP图片的一点理解,读取图象数据到数组
- 关于NTKO_office的操作(从数据库中提取数据,写入到NTKO_office_Word中)
- 关于图片上传数据库,下载到picturebox里的操作。
- 关于为了保证数据安全,让已登陆用户在不操作的情况下超时退出的处理
- ASP向Excel导数据(图片)终结版 ASP操作Excel
- 关于利用DataGrid进行数据查询、修改操作
- Silverlight中关于DomainService操作数据的分析.
- 关于DSP6000 CCS BOIS 的原子操作-数据保护
- 关于数据记录的操作日志
- 关于Oracle数据导入导出的一些操作
- 关于JDBC中的ResultSet的更新数据操作
- 回帖整理: 关于面向对象与数据操作的集合贴
- 关于为了保证数据安全,让已登陆用户在不操作的情况下超时退出的处理
- MES操作数据库后数据显示的一点小问题,关于DataView的rowfilter
- 数据图片的生成和一些操作
- 关于c#中数据的原子操作及让人郁闷的InterLocked类
- 关于多个数据库间进行数据操作的问题
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- SilverLight学习笔记--关于使用IValueConvert对绑定数据的格式化操作
- Silverlight中关于DomainService操作数据的分析.