本文基于cocos2d-x 2.2.3
项目需要一个功能,就是在点击某个不规则边缘图片的时候,不响应图片的透明部分。
以前在 AS3 中处理类似需求的时候,就是获取点击点的像素值,得到 Alpha 的值,然后根据 Alpha 的值来判断是否需要响应。
但在 cocos2d-x 中,有一些问题。
cocos2d-x 的渲染流程是这样的:
- 载入一张图片,将它解析成 CCImage 对象;
- 根据 CCImage 对象,建立 CCTexture2D 对象;
- 在 CCTexturte2D 对象中,将 CCImage 对象中的定点和像素信息上传到显卡缓存;
- 删除 CCImage 对象。
从上面的流程可以看出,其实我们在看到这张显示在 cocos2d-x 中的图片时,图像的像素信息已经不存在 CCTexture2D 中了。
那么,怎么得到这些像素值呢?
一、预先存储的方法
这种方法的原理就是修改 CCTexture2D ,使其在处理 CCImage 的时候将需要的像素信息缓存下来。
这种方法的弊端如下:
- 会占用内存来保存像素信息,如果保存所有的像素信息,则占用的内存还相当大;
- 需要修改 CCTexture2D。
二、使用 CCTexture2DMutable
下面两篇文章中都提到了这个类:
这个类继承了 CCTextuer2D,并在内部实现了对像素信息的缓存。如果要实现绘图等功能,这个类倒是挺有用的。
另外,在 cocos2d-x 中的 extensions/CCArmature
扩展中也带有这个类。
这种方法的弊端如下:
- 与 CCTextureCache 和 CCSprite 等常用类不兼容;
- 占用内存保存像素信息。
三、重绘图片取得像素
我采用的是这种办法。流程如下:
这种方法的弊端如下:
当然,如果确实需要在同一张图片上多次操作,缓存可以程序员自己来做。
为了实现这个流程,我修改了 CCImage.h,增加了两个方法 getColor4B
和 getColor4F
: