自定义绘图

引擎在CCNode中预留了自定义绘图接口,如:
1 void CCNode::draw()
2 {
3     //CCAssert(0);
4     //可以重载此方法
5     //最好仅在这个方法中绘制自定义的内容
6 }
draw函数是一个每帧都会调用的函数,注释中明确指出,通常情况下只应该在这个函数内编写自定义绘制效果,不要再这个函数以外的任何地方绘图。这是因为引擎在这个函数调用的上下文之间进行了绘图环境的准备和必要的状态设置。在其他地方添加绘制代码可能引起不可预料的错误。
 
遮罩层
遮罩效果又称剪刀效果,允许一切的渲染结果只在屏幕的一个指定区域显示:开启遮罩效果后,一切都绘制提交都是正常渲染的,但最终只有屏幕上的指定区域会被绘制。
 
数据交流
CCImage和CCTexture2D是引擎提供的描述纹理图片的类,也是和显卡进行数据交换时主要涉及的数据结构。
 
CCImage:
CCImage在“CCImage.h”中定义,表示一张加载到内存的纹理图片。在其内部的实现中,纹理以每个像素的颜色值保存在内存之中。CCImage通常作为文件和显卡间数据交换的一个工具,因此主要提供了两个方面的功能:一方面是文件的加载与保存,另一方面是内存缓冲区的读写。
我们可以使用CCImage轻松地读写图片文件,目前,CCImage支持PNG、JPEG、和TIFF三种图片格式。
以下几个方法:
1 bool initWithImageFile(const char* strPath, EImageFormat imageType = kFmtPng);
2 bool initWithImageFileThreadSafe(const char* fullpath, EImageFormat imageType = kFmtPng);
3 bool saveToFile(const char* pszFilePath, bool bIsToRGB = True);
CCImage也提供了读写内存的接口。getData和getDataLen这两个方法提供了后去当前纹理的缓冲区的功能,而initWithImageData方法提供了使用像素数据初始化图片的功能。
如下:
1 unsigned char* getData();
2 int getDataLen();
3 bool initWithImageData(void* pData, int nDataLen, EImageFormat eFmt = kFmtUnKnown, int nWidth = 0, int nHeight = 0, int nBitsPerComponent = 8);
4  
CCTexture2D:
它描述了一张纹理,知道如何将自己绘制到屏幕上。通过该类还可以设置纹理过滤、抗锯齿等参数。还提供一个接口,将字符串创建成纹理。
值得注意的是:该类所包含的纹理大小必须是2的幂次,因此纹理的大小不一定就等于图片大小;另外,有别于CCImage,这是一张存在于显存中的纹理,实际上并不一定存在于内存中。
 
截屏功能:
首先,我们使用OpenGL的一个底层函数glReadPixels实现截图:
void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
//这个函数讲当前屏幕的像素读取到一个内存块pixels中,且pixels指针指向的内存必须足够大。
原文地址:https://www.cnblogs.com/Blogs-young-chan/p/5250391.html