转自:http://blog.csdn.net/tyxkzzf/article/details/38703883

CCSprite* getHighlightSprite(CCSprite* normalsprite) {
if ( !normalsprite) {
return CreateDefaultSprite();
}
//CCSprite转成CCimage
CCPoint p = normalsprite->getAnchorPoint();
normalsprite->setAnchorPoint(ccp(, ));
CCRenderTexture *outTexture = CCRenderTexture::create((int)normalsprite->getContentSize().width, (int)normalsprite->getContentSize().height);
outTexture->begin();
normalsprite->visit();
outTexture->end();
normalsprite->setAnchorPoint(p); CCImage* finalImage = outTexture->newCCImage();
unsigned char *pData = finalImage->getData();
int iIndex = ; for (int i = ; i < finalImage->getHeight(); i ++) {
for (int j = ; j < finalImage->getWidth(); j ++) {
// highlight
int iHightlightPlus = ;
int iBPos = iIndex;
unsigned int iB = pData[iIndex];
iIndex ++;
unsigned int iG = pData[iIndex];
iIndex ++;
unsigned int iR = pData[iIndex];
iIndex ++;
//unsigned int o = pData[iIndex];
iIndex ++; //原来的示例缺少
iB = (iB + iHightlightPlus > ? : iB + iHightlightPlus);
iG = (iG + iHightlightPlus > ? : iG + iHightlightPlus);
iR = (iR + iHightlightPlus > ? : iR + iHightlightPlus);
// iR = (iR < 0 ? 0 : iR);
// iG = (iG < 0 ? 0 : iG);
// iB = (iB < 0 ? 0 : iB);
pData[iBPos] = (unsigned char)iB;
pData[iBPos + ] = (unsigned char)iG;
pData[iBPos + ] = (unsigned char)iR;
}
} CCTexture2D *texture = new CCTexture2D;
texture->initWithImage(finalImage);
CCSprite* newSprite = CCSprite::createWithTexture(texture);
delete finalImage;
texture->release(); return newSprite;
}

这里有更详细的一片介绍文章《Cocos2dx如何反白高亮CCSprite》点击打开链接

在做游戏时遇到需要使用纯白色高亮精灵的场合,尝试了很多办法没有解决问题,目前有以下几种解法:  最简单当然是切换成和精灵图片一样的另一张纯白图片。 另外就是使用glTexEnvi,具体如下:

重写一个类继承CCSprite, 改写draw 函数,如下代码:

void YourSprite::setHightlight(bool hightlight)
{
if (m_hightlight != hightlight)
{
m_hightlight = hightlight;
if (m_hightlight)
{
ccBlendFunc blendFunc = {GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA};
setBlendFunc(blendFunc);
}
else
{
ccBlendFunc blendFunc = {CC_BLEND_SRC, CC_BLEND_DST};
setBlendFunc(blendFunc);
}
}
}
void YourSprite::draw() { CCNode::draw(); CCAssert(! m_bUsesBatchNode, ""); // Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
// Needed states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
// Unneeded states: -
bool newBlend = m_sBlendFunc.src != CC_BLEND_SRC || m_sBlendFunc.dst != CC_BLEND_DST;
if (newBlend)
{
glBlendFunc(m_sBlendFunc.src, m_sBlendFunc.dst);
} #define kQuadSize sizeof(m_sQuad.bl)
if (m_pobTexture)
{
glBindTexture(GL_TEXTURE_2D, m_pobTexture->getName());
}
else
{
glBindTexture(GL_TEXTURE_2D, );
} if (m_hightlight)
{
glActiveTexture( GL_TEXTURE0 ); //the magic
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); //you can change me... GL_REPLACE, GL_SUBSTRACT produce nice effects
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS); //setColor
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE); //your texture
}
long offset = (long)&m_sQuad; // vertex
int diff = offsetof(ccV3F_C4B_T2F, vertices);
glVertexPointer(, GL_FLOAT, kQuadSize, (void*)(offset + diff)); // color
diff = offsetof( ccV3F_C4B_T2F, colors);
glColorPointer(, GL_UNSIGNED_BYTE, kQuadSize, (void*)(offset + diff)); // tex coords
diff = offsetof( ccV3F_C4B_T2F, texCoords);
glTexCoordPointer(, GL_FLOAT, kQuadSize, (void*)(offset + diff)); glDrawArrays(GL_TRIANGLE_STRIP, , ); if( newBlend )
{
glBlendFunc(CC_BLEND_SRC, CC_BLEND_DST);
} #if CC_SPRITE_DEBUG_DRAW == 1
// draw bounding box
CCSize s = m_tContentSize;
CCPoint vertices[] = {
ccp(,), ccp(s.width,),
ccp(s.width,s.height), ccp(,s.height)
};
ccDrawPoly(vertices, , true);
#elif CC_SPRITE_DEBUG_DRAW == 2
// draw texture box
const CCSize& s = m_obRect.size;
const CCPoint& offsetPix = getOffsetPositionInPixels();
CCPoint vertices[] = {
ccp(offsetPix.x,offsetPix.y), ccp(offsetPix.x+s.width,offsetPix.y),
ccp(offsetPix.x+s.width,offsetPix.y+s.height), ccp(offsetPix.x,offsetPix.y+s.height)
};
ccDrawPoly(vertices, , true);
#endif // CC_SPRITE_DEBUG_DRAW if (m_hightlight)
{
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
} }

cocos2dx 获取精灵的高亮效果的更多相关文章

  1. cocos2d-x 2.0 拖尾效果分析

    转自:http://game.dapps.net/gamedev/game-engine/7281.html 在Cocos2d-x中,拖尾效果有一个专门的类CCMotionStreak来实现.下面我们 ...

  2. 【转】Cocos2d-x 2.0 拖尾效果深入分析

    Cocos2d-x 2.0 拖尾效果深入分析 另:本章所用Cocos2d-x版本为: cocos2d-2.0-x-2.0.2@ Aug 30 2012 http://cn.cocos2d-x.org/ ...

  3. 使用CodeMirror在浏览器中实现编辑器的代码高亮效果

    使用CodeMirror在浏览器中实现编辑器的代码高亮效果 在网站后台管理中希望能够对网站的样式表css与js文件以及模板html进行管理,在编辑的时候只是以普通文本展示又太普通,显得好难看,于是便在 ...

  4. cesium 3dtiles模型单体化点击高亮效果

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. c ...

  5. UI-切圆角、透明度、取消按钮点击高亮效果、按钮文字带下划线

    一.切UIView的某个角为圆角 如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架).而若要指定某 ...

  6. UITableView或UIScrollVIew上的UIButton的高亮效果

    UITableView或UIScrollVIew上的UIButton的高亮效果 原文地址:http://www.jianshu.com/p/b4331f06bd34 最近做项目的时候发现,UIScro ...

  7. cocos2dx 2.x实现闪电效果(贴画版)

    cocos2dx 2.x实现闪电效果(非画线版) 在网上搜索到一个直接用opengl画线实现的版本,但放在游戏中效果不太搭,要求用贴图的.我这个版本用的也是画线版的算法. 闪动的时候效果还可以,每段衔 ...

  8. cocos2d-x 获取图片的某像素点的RGBA颜色 -转

    cocos2d-x 获取图片的某像素点的RGBA颜色  原文:http://www.cnblogs.com/jaoye/archive/2013/02/19/2916501.html 没做过 太多的图 ...

  9. cocos2d-x 获取系统时间

    转自:http://blog.csdn.net/jinjian2009/article/details/9449585 之前使用过cocos2d-x获取系统时间,毫秒级的 long getCurren ...

随机推荐

  1. 10个经典Java面试题

    1.Java的HashMap是怎样工作的? HashMap是一个针对数据结构的键值.每一个键都会有对应的值.关键是识别这种值. HashMap 基于 hashing 原理,我们通过 put ()和 g ...

  2. js关于变量作为if条件的真假问题

    var a = ""; if(a){ ..... }else{ .....} 以下情况会被认为返回false: "" 空的字符串 为 0 的数字 为 null ...

  3. 如何在linux下解压缩rar格式的文件压缩包

    ##########################################################如何在linux下解压缩rar格式的文件压缩包#date:2014年2月15日22: ...

  4. Windows App开发之经常使用控件与应用栏

    控件的属性.事件与样式资源 怎样加入控件 加入控件的方式有多种,大家更喜欢以下哪一种呢? 1)使用诸如Blend for Visual Studio或Microsoft Visual Studio X ...

  5. Android中List循环遍历性能对照

    在android开发中仅仅要是列表式风格界面我们差点儿都须要用到List来存放数据,在数量非常少的List的话差点儿不论什么一种循环遍历方式总体性能都无区别.可是当我们遇到数据量稍大的时候有必要考虑用 ...

  6. c# combobox 绑定枚举方式

    建立一个类 : using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  7. EasyPlayer Android安卓RTSP服务器低延时再优化策略

    EasyPlayer低延迟再优化策略 EasyPlayer是一款专门针对RTSP协议进行过优化的播放器.其中两个我们引以为傲的的优点就是起播快和低延迟.最近我们遇到一些需求,其对延迟要求非常苛刻,于是 ...

  8. 关于String,StringBuffer与StringBuilder的区别

    String是字符串常量对象,对其进行改变时会相当影响效率,特别注意在循环中直接拼接字符串效率非常差. 如果你想改变字符串的值,更加推荐使用StringBuffer与StringBuilder两种可变 ...

  9. 列举Python常用数据类型并尽量多的写出其中的方法

    #1 把字符串的第一个字符大写 string.capitalize() #2 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 string.center(width) #3 返回 ...

  10. ajax实时获取下拉数据

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ajax ...