</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;
}

win32/CCDevice.cpp

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.bmiHeader.biSize = sizeof(bi.bmiHeader);
        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.bmiHeader.biHeight = (bi.bmiHeader.biHeight > 0)
            ? - bi.bmiHeader.biHeight : bi.bmiHeader.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;
}

最后,将CCTexture2D.cpp的initWithString(const char *text,const FontDeFinition& textDeFinition)方法改成:

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字体去描边的更多相关文章

  1. HTML5 3D书本翻页动画的实现示例

    这是一款十分炫酷的HTML5 3D书本翻页动画,效果相对比较简单,拖拽鼠标模拟用手翻页,需要的朋友们下面随着小编来一起学习学习吧

  2. 移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. ios – 在applicationWillEnterForeground触发时更改UIView

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  4. UILabel导致应用程序在添加到视图时崩溃(仅限Xcode 6和iOS 8)

    我已将我的项目转换为Xcode6,以便为iOS8构建.但是,特定的UILabel会导致应用程序在添加到视图层次结构时崩溃.这是我收到的唯一错误日志:我无法在项目中的任何位置找到contentInsetsFromFonts方法.此外,我甚至无法在网上任何地方找到它的参考,包括Apple的文档.我没有为这个UIViewController使用NIB,因此UI是在loadView方法中构建的:该应用程序

  5. iOS 7通知中心与标签一样

    您可以试试,也许在将模糊应用到标签之前为模糊添加一点白色.

  6. iOS safari输入插入颜色

    我在iPhone设备上有一个小的CSS问题.我的搜索输入为蓝色,当用户关注它时,插入符号几乎不可见:在所有桌面浏览器中,即使在桌面Safari上,它也具有正确的颜色(白色).知道如何修复此问题并更改iOS设备上的插入颜色吗?

  7. 如何计算iOS 7中的实际字体大小(不是边框)?

    编辑:链接的“重复”问题仅涉及计算文本矩形.我需要在标签缩放之后计算实际字体大小,而不是字符串大小.此方法现已弃用:如何在iOS7中计算UILabel的字体大小,以缩小文字大小以适应?

  8. ios – 为什么在presentmodalviewcontroller调用时,navigationItem.titleView会左对齐?

    我正在使用UILabel作为导航栏的titleView.它工作正常,除了当我呈现模态视图控制器时,titleView从导航栏的中心移动到最左边.我在3.0及以上测试过.这是相关代码:截图:知道为什么会这样吗?

  9. ios – 在XCode中的UI测试期间无法访问自定义视图

    我们必须执行一些时髦的动画,这是我们最好的布局).问题是我无法访问此视图以模拟其上的点击.我可以使用app.staticText[“输入名称…”]访问标签,但是如果我点击它.记录我点击标签的会话将产生app.staticText[“输入名称…”

  10. ios – UITableView以编程方式调用滑动操作

    我有一个UITableView,用户可以向左滑动以显示动作.这一切都按预期工作.当用户点击单元格的某个部分时,我想触发这个.如何以编程方式调用此幻灯片动作?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部