大佬教程收集整理的这篇文章主要介绍了cocos2dx3.0的label字体去描边,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
</pre></h4><p><pre name="code" class="cpp">
近日,一直被3.0的字体描边所困扰,在安卓手机下字体没问题,挺好看,但是在iphone手机上显示特别不清晰,一直很怪异的感觉,尤其是白色的label,后来我的同事兼师父将底层改了下(3.2之后的版本貌似就不存在这个问题了)。
方法:找到项目/cocos2d/cocos/2d/platform目录下的 CCDevice.h文件 的静态gettexturedatafortext方法改成这个(即加一个参数)
static Data getTextureDataForText(const char * text,const FontDefinition& textDefinition,TextAlign align,int &width,int &height,bool& hasPremultipliedAlpha);,然后把相应平台的这个函数分别增一个参数(因为只有ios好像有这个问题,所以其他的平台暂时不用改,但是需要在功能函数添加一个实参):
ios/CCDevice.mm
Data Device::getTextureDataForText(const char * text,bool& hasPremultipliedAlpha) { Data ret; do { tImageInfo info = {0}; info.width = textDefinition._dimensions.width; info.height = textDefinition._dimensions.height; info.hasShadow = textDefinition._shadow._shadowEnabled; info.shadowOffset.width = textDefinition._shadow._shadowOffset.width; info.shadowOffset.height = textDefinition._shadow._shadowOffset.height; info.shadowBlur = textDefinition._shadow._shadowBlur; info.shadowOpacity = textDefinition._shadow._shadowOpacity; info.hasStroke = textDefinition._stroke._strokeEnabled; info.strokeColorR = textDefinition._stroke._strokeColor.r / 255.0f; info.strokeColorG = textDefinition._stroke._strokeColor.g / 255.0f; info.strokeColorB = textDefinition._stroke._strokeColor.b / 255.0f; info.strokeSize = textDefinition._stroke._strokeSize; info.TintColorR = textDefinition._fontFillColor.r / 255.0f; info.TintColorG = textDefinition._fontFillColor.g / 255.0f; info.TintColorB = textDefinition._fontFillColor.b / 255.0f; if (! _initWithString(text,align,textDefinition._fontName.c_str(),textDefinition._fontSize,&info)) { break; } height = (short)info.height; width = (short)info.width; ret.fastSet(info.data,width * height * 4); hasPremultipliedAlpha = true; } while (0); return ret; }
Data Device::getTextureDataForText(const char * text,bool& hasPremultipliedAlpha) { Data ret; do { BitmapDC& dc = sharedBitmapDC(); if (! dc.setFont(textDefinition._fontName.c_str(),textDefinition._fontSizE)) { log("Can't found font(%s),use system default",textDefinition._fontName.c_str()); } // draw text SIZE size = {textDefinition._dimensions.width,textDefinition._dimensions.height}; CC_BREAK_IF(! dc.drawText(text,size,align)); int dataLen = size.cx * size.cy * 4; unsigned char* dataBuf = (unsigned char*)malloc(sizeof(unsigned char) * dataLen); CC_BREAK_IF(! dataBuf); struct { BITMAPINFOHEADER bmiHeader; int mask[4]; } bi = {0}; bi.bR_51_11845@iHeader.biSize = sizeof(bi.bR_51_11845@iHeader); CC_BREAK_IF(! GetDIBits(dc.getDC(),dc.getBitmap(),NULL,(LPBITMAPINFO)&bi,DIB_RGB_COLORS)); width = (short)size.cx; height = (short)size.cy; // copy pixed data bi.bR_51_11845@iHeader.biHeight = (bi.bR_51_11845@iHeader.biHeight > 0) ? - bi.bR_51_11845@iHeader.biHeight : bi.bR_51_11845@iHeader.biHeight; GetDIBits(dc.getDC(),height,dataBuf,DIB_RGB_COLORS); // change pixel's alpha value to 255,when it's RGB != 0 COLORREF * pPixel = NULL; for (int y = 0; y < height; ++y) { pPixel = (COLORREF *)dataBuf + y * width; for (int x = 0; x < width; ++X) { COLORREF& clr = *pPixel; clr = (0xffffff | (GetRValue(clr) << 24)); ++pPixel; } } ret.fastSet(dataBuf,dataLen); } while (0); return ret; }
bool Texture2D::initWithString(const char *text,const FontDefinition& textDefinition) { if(!text || 0 == strlen(text)) { return false; } #if CC_ENABLE_CACHE_TEXTURE_DATA // cache the texture data VolatileTextureMgr::addStringTexture(this,text,textDefinition); #endif bool ret = false; Device::TextAlign align; if (TextVAlignment::TOP == textDefinition._vertAlignment) { align = (TextHAlignment::CENTER == textDefinition._alignment) ? Device::TextAlign::TOP : (TextHAlignment::LEFT == textDefinition._alignment) ? Device::TextAlign::TOP_LEFT : Device::TextAlign::TOP_RIGHT; } else if (TextVAlignment::CENTER == textDefinition._vertAlignment) { align = (TextHAlignment::CENTER == textDefinition._alignment) ? Device::TextAlign::CENTER : (TextHAlignment::LEFT == textDefinition._alignment) ? Device::TextAlign::LEFT : Device::TextAlign::rIGHT; } else if (TextVAlignment::BOTTOM == textDefinition._vertAlignment) { align = (TextHAlignment::CENTER == textDefinition._alignment) ? Device::TextAlign::BOTTOM : (TextHAlignment::LEFT == textDefinition._alignment) ? Device::TextAlign::BOTTOM_LEFT : Device::TextAlign::BOTTOM_RIGHT; } else { CCassERT(false,"Not supported alignment format!"); return false; } #if (CC_TARGET_PLATFORM != CC_PLATFORM_ANDROID) && (CC_TARGET_PLATFORM != CC_PLATFORM_IOS) CCassERT(textDefinition._stroke._strokeEnabled == false,"Currently stroke only supported on iOS and Android!"); #endif PixelFormat pixelFormat = g_defaultAlphaPixelFormat; unsigned char* outTemPDAta = nullptr; ssize_t outTemPDAtaLen = 0; int imageWidth; int imageHeight; auto textDef = textDefinition; auto contentScaleFactor = CC_CONTENT_SCALE_FACTOR(); textDef._fontSize *= contentScaleFactor; textDef._dimensions.width *= contentScaleFactor; textDef._dimensions.height *= contentScaleFactor; textDef._stroke._strokeSize *= contentScaleFactor; textDef._shadow._shadowEnabled = false; bool hasPremultipliedAlpha; Data outData = Device::getTextureDataForText(text,textDef,imageWidth,imageHeight,hasPremultipliedAlpha); if(outData.isNull()) { return false; } Size imageSize = Size((float)imageWidth,(float)imageHeight); pixelFormat = convertDataToFormat(outData.getBytes(),imageWidth*imageHeight*4,PixelFormat::rGBA8888,pixelFormat,&outTemPDAta,&outTemPDAtaLen); ret = initWithData(outTemPDAta,outTemPDAtaLen,imageSizE); if (outTemPDAta != nullptr && outTemPDAta != outData.getBytes()) { free(outTemPDAta); } _hasPremultipliedAlpha = hasPremultipliedAlpha; return ret; }
以上是大佬教程为你收集整理的cocos2dx3.0的label字体去描边全部内容,希望文章能够帮你解决cocos2dx3.0的label字体去描边所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。