Cocos2dx change line

在 cocos2dx change line 的实现中,我们能够简单的使用 dimensions属性控制换行。使用它仅仅需将相应的參数值传入构造函数,或者调用 setDimensions 函数就可以。

它的换行策略是:当一个单词超出限制长度时。将它移动到下一行。

有时这样的策略并不合适。

比如。在某些语言中,单词都比較长。

假设採用这样的策略。会出现每一行中仅仅有一个单词。

因此须要更改换行策略。当超出限制长度时,使用 - 作为一个分隔单词的标志。

换行策略调用

通过查看Cocos2d-x中换行的实现方式,我发现换行策略是区分平台编程出来的代码。

也就是说。为了更改换行策略,我须要分别编写 IOS 和 Java 两部分代码。

由于我的目标平台是 Android 平台,因此我仅仅对Java文件进行了更改。IOS 平台的换行策略调用的是系统函数,有兴趣研究的读者能够跟踪源代码更改。入口函数为:

bool CCTexture2D::initWithString(const char *text, ccFontDefinition *textDefinition)
{
...... CCImage* pImage = new CCImage();
do
{
CC_BREAK_IF(NULL == pImage); bRet = pImage->initWithStringShadowStroke(text,
(int)textDefinition->m_dimensions.width,
(int)textDefinition->m_dimensions.height,
eAlign,
textDefinition->m_fontName.c_str(),
textDefinition->m_fontSize,
textDefinition->m_fontFillColor.r / 255,
textDefinition->m_fontFillColor.g / 255,
textDefinition->m_fontFillColor.b / 255,
shadowEnabled,
shadowDX,
shadowDY,
shadowOpacity,
shadowBlur,
strokeEnabled,
strokeColorR,
strokeColorG,
strokeColorB,
strokeSize); CC_BREAK_IF(!bRet);
bRet = initWithImage(pImage); } while (0); ......
}

更改Java实现

Android 平台相应的 Java 文件位于 $(2DX-Root)/cocos2dx/platform/android/java/src/org/cocos2dx/lib 目录中。文件名称是 Cocos2dxBitmap.java

首先,我添加了 divideStringWithMaxWidthByFlag 函数。将它作为还有一个换行策略的实现函数。

// add by fansy for "—" style words
private static LinkedList<String> divideStringWithMaxWidthByFlag(
final String pString, final int pMaxWidth, final Paint pPaint) {
final int charLength = pString.length();
int start = 0;
int tempWidth = 0;
LinkedList<String> strList = new LinkedList<String>(); if( !isChinese(pString) )
{
/* Break a String into String[] by the width & should wrap the word. */
for (int i = 1; i < charLength-1; ++i) {
tempWidth = (int) FloatMath.ceil(pPaint.measureText(pString, start,i+1));
if (tempWidth >= pMaxWidth) {
if(pString.charAt(i) == ' ') //end with " "
{
//change line at i
strList.add(pString.substring(start, i));
i = i + 1; // skip space
}
else if(i>1 && pString.charAt(i-2) == ' ') //only one "-" left after change line
{
//change line at i-2
strList.add(pString.substring(start, i-2));
i = i -2; // skip space
}
else if(i>0 && pString.charAt(i-1) == ' ') //only one "-" left after change line
{
//change line at i-1
strList.add(pString.substring(start, i-1));
i = i -1; // skip space
}
else if(i>0) //replace "-" at i-2
{
//split at i-1 add "-" at tail change line at i-1
strList.add(pString.substring(start, i-1)+"-");
i--;
} /* Remove spaces at the beginning of a new line. */
while (pString.charAt(i) == ' ') {
++i;
} start = i;
}
} /* Add the last chars. */
if (start < charLength) {
strList.add(pString.substring(start));
}
}
else
{
strList = divideStringWithMaxWidth(pString, pMaxWidth, pPaint);
}
return strList;
} // 依据Unicode编码完美的推断中文汉字和符号
private static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
return true;
}
return false;
} // 完整的推断中文汉字和符号
public static boolean isChinese(String strName) {
char[] ch = strName.toCharArray();
for (int i = 0; i < ch.length; i++) {
char c = ch[i];
if (isChinese(c)) {
return true;
}
}
return false;
} //end add by fansy

添加函数之后。改动在 splitString 中的调用:

private static String[] splitString(final String pString,
final int pMaxWidth, final int pMaxHeight, final Paint pPaint) {
final String[] lines = pString.split("\\n");
String[] ret = null;
final FontMetricsInt fm = pPaint.getFontMetricsInt();
final int heightPerLine = (int) Math.ceil(fm.bottom - fm.top);
final int maxLines = pMaxHeight / heightPerLine; if (pMaxWidth != 0) {
final LinkedList<String> strList = new LinkedList<String>();
for (final String line : lines) {
/*
* The width of line is exceed maxWidth, should divide it into
* two or more lines.
*/
final int lineWidth = (int) FloatMath.ceil(pPaint
.measureText(line));
if (lineWidth > pMaxWidth) {
strList.addAll(Cocos2dxBitmap.divideStringWithMaxWidthByFlag(
line, pMaxWidth, pPaint));
} else {
strList.add(line);
......
}

更换调用函数后,编译打包。执行程序就可以看到不同的换行效果。本篇博客出自阿修罗道,转载请注明出处,禁止用于商业用途:http://blog.csdn.net/fansongy/article/details/39992241

Cocos2d-x 更改文字换行风格 ( cocos2dx change line )的更多相关文章

  1. Change Line Type in OpenCascade

    Change Line Type in OpenCascade eryar@163.com 关键字KeyWords:OpenCascade,Line Aspect, Line Type 在OpenCa ...

  2. 代码风格——Cocos2d-x学习历程(四)

    1.Cocos2d-x拥有一个包含其他所有头文件的文件"cocos2d.h".通常,我们只需要在使用时包含这个头文件,就可以使用引擎的全部功能了. 2.Cocos2d-x的类都放置 ...

  3. 【Cocos2d入门教程二】Cocos2d-x基础篇

    上一章已经学习了环境的搭建.这一章对基础概念进行掌握.内容大概有: 1.导演 2.场景 3.节点 4.层 4.精灵 1.导演(Director) 导演存在的主要作用: a.环境设定(帧率 初始化ope ...

  4. 【Cocos2d入门教程一】Cocos2d-x环境搭建

    在进行Cocos2d游戏开发前 我们先来配置一下环境,我们先来准备一下工具,我们所需要的工具分别为: 1.Cocos2d引擎 2.JDK 3.SDK 4.NDK 5.ANT 6.ADT 1.下载Coc ...

  5. 【Cocos2d入门教程四】Cocos2d-x菜单篇

    游戏世界多姿多彩,无论多靓丽的游戏,多耐玩的游戏,在与游戏用户交互上的往往是菜单. 上一章我们已经大概了解了导演.节点.层.精灵.这一章以菜单为主题. 菜单(Menu)包含以下内容: 1.精灵菜单项( ...

  6. 【Cocos2d入门教程六】Cocos2d-x事件篇之触摸

    Cocos游戏当中产生一个事件时,可以有多个对象在监听该事件,所以有优先级(Priority).优先级越高(Priority值越小),事件响应越靠前. 关系图: 新 事件分发机制:在2.x 版本事件处 ...

  7. 【Cocos2d入门教程五】Cocos2d-x动作篇

    动作类(Action)是所有动作的基类,它创建的一个对象代表一个动作.动作作用于Node,包括继承于之下的Layer.Sprite.因此每个动作 都需要由Node对象或者其继承者执行.动作类(Acti ...

  8. highcharts dynamic change line color

    mouseOut: function(){ this.series.graph.attr({"stroke","#ccc"}) }

  9. cocos2d-x (Android)之-那些常见的error记

    转自:http://blog.csdn.net/callchunli/article/details/8929813 (2013/9/2) build.xml:939: java.lang.Array ...

随机推荐

  1. 粟粟的书架(bzoj 1926)

    Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架, ...

  2. 用.net开发wap

    原文发布时间为:2010-08-19 -- 来源于本人的百度文章 [由搬家工具导入] .NET 模板:http://download.csdn.net/source/2631001 WAP应用程序结构 ...

  3. HTML title属性换行显示的方法

    原文发布时间为:2009-04-22 -- 来源于本人的百度文章 [由搬家工具导入] 解决的方法有两种: 1.将title属性分成几行来写,例如:<a href=#" title=&q ...

  4. config .net webapi to return json.

    1.add content negotiator using System; using System.Collections.Generic; using System.Linq; using Sy ...

  5. Spring积累总结

    1.spring 的优点: 1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很 ...

  6. (5)python tkinter-单选、多选

    单选按钮 tkinter.Radiobutton(root,text='a').pack() tkinter.Radiobutton(root,text='b').pack() tkinter.Rad ...

  7. JSP-Servlet-SpringMVC

    作者:码思客链接:https://zhuanlan.zhihu.com/p/37612412来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本篇文章,我们来讲讲技术,系 ...

  8. luogu P1941 飞扬的小鸟

    题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便 ...

  9. Java开发笔记(一百零三)线程间的通信方式

    前面介绍了多线程并发之时的资源抢占情况,以及利用同步.加锁.信号量等机制解决资源冲突问题,不过这些机制只适合同一资源的共享分配,并未涉及到某件事由的前因后果.日常生活中,经常存在两个前后关联的事务,像 ...

  10. weight initilzation

    1. pytorch提供接口 method 1  torch.nn.init里面有很多初始化分布 import torch.nn.init as init self.conv1 = nn.Conv2d ...