在 cocos2d-x 中获取纹理的像素值
本文基于cocos2d-x 2.2.3 项目需要一个功能,就是在点击某个不规则边缘图片的时候,不响应图片的透明部分。 以前在 AS3 中处理类似需求的时候,就是获取点击点的像素值,得到 Alpha 的值,然后根据 Alpha 的值来判断是否需要响应。 但在 cocos2d-x 中,有一些问题。 cocos2d-x 的渲染流程是这样的:
从上面的流程可以看出,其实我们在看到这张显示在 cocos2d-x 中的图片时,图像的像素信息已经不存在 CCTexture2D 中了。 那么,怎么得到这些像素值呢? 一、预先存储的方法下面两篇文章采用了预先存储的方法:
这种方法的原理就是修改 CCTexture2D ,使其在处理 CCImage 的时候将需要的像素信息缓存下来。 这种方法的弊端如下:
二、使用 CCTexture2DMutable下面两篇文章中都提到了这个类:
这个类继承了 CCTextuer2D,并在内部实现了对像素信息的缓存。如果要实现绘图等功能,这个类倒是挺有用的。 另外,在 cocos2d-x 中的 这种方法的弊端如下:
三、重绘图片取得像素我采用的是这种办法。流程如下:
这种方法的弊端如下:
当然,如果确实需要在同一张图片上多次操作,缓存可以程序员自己来做。 为了实现这个流程,我修改了 CCImage.h,增加了两个方法 2014-10-24更新:上面的代码没有考虑越界问题,在传递的坐标不在图像中时,程序会崩溃。 最新的代码改正了问题,请参考 github 。 由于 CCImage 是跨平台实现的,所以放在头文件中比放在实现文件中要方便许多。否则,就需要在 CCImage 的若干个平台相关实现中分别执行实现了。 下面是 quick-cocos2d-x 中的实现代码,我将其放在了 CCSpriteExtned.lua 框架中,这样能让所有的 CCSprite 实例都支持这个方法。 具体的实现请看代码,不解释了。 这个方法已经合并进入 quick-cocos2d-x 的 develop 分支。 2014-10-24更新:由于 newCCImage 方法在 C++ 中是请求堆内存并返回一个指针。因此必须手动释放。上面的代码没有考虑释放问题,将会导致内存泄露。 最新的代码改正了问题,请参考 github 。 源: http://zengrong.net/post/2104.htm(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |