更改文字换行风格 ( cocos2dx change line )

Cocos2dx change line

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

它的换行策略是:当一个单词超出限制长度时,将它移动到下一行。有时这种策略并不合适。例如,在某些语言中,单词都比较长。如果采用这种策略,会出现每一行中只有一个单词。因此需要更改换行策略。当超出限制长度时,使用 - 作为一个分隔单词的标志。

换行策略调用

通过查看Cocos2d-x中换行的实现方式,我发现换行策略是区分平台编程出来的代码。也就是说,为了更改换行策略,我需要分别编写 IOS 和 Java 两部分代码。因为我的目标平台是 Android 平台,因此我只对Java文件进行了更改。IOS 平台的换行策略调用的是系统函数,有兴趣研究的读者可以跟踪源码更改。入口函数为:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

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 函数,将它作为另一个换行策略的实现函数。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

// 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 中的调用:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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://www.songyang.net/cocos2dx-change-line/

时间: 2024-10-28 04:05:14

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

Cocos2d-x 更改文字换行风格 ( cocos2dx change line )

Cocos2dx change line 在 cocos2dx change line 的实现中,我们能够简单的使用 dimensions属性控制换行.使用它仅仅需将相应的參数值传入构造函数,或者调用 setDimensions 函数就可以. 它的换行策略是:当一个单词超出限制长度时.将它移动到下一行. 有时这样的策略并不合适. 比如.在某些语言中,单词都比較长. 假设採用这样的策略.会出现每一行中仅仅有一个单词. 因此须要更改换行策略.当超出限制长度时,使用 - 作为一个分隔单词的标志. 换行

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

1.Cocos2d-x拥有一个包含其他所有头文件的文件"cocos2d.h".通常,我们只需要在使用时包含这个头文件,就可以使用引擎的全部功能了. 2.Cocos2d-x的类都放置于cocos2d命名空间下.在游戏中,我们常使用引擎提供的另一个宏USING_NS_CC来引用cocos2d命名空间: #define USING_NS_CC using namespace cocos2d. 3.类的命名与Cocos2d-iPhone一致,由类库缩写加上类名称组成,其中类库缩写采用大写,类名

&lt;add assembly=&quot;Microsoft.Office.Tools.Word, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F

Server Error in '/' Application. Configuration Error Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appr

oracle的进程管理

Oracle进程管理 Oracle进程--server processes + 后台进程              ----------------   --------                 PGA               SGA server processes--功能:负责SQL语句的执行,包括从LRU链表中查找需要的数据块,将修改的内容写入缓冲区.后台进程------功能:将缓冲区的内容写入磁盘:1.将log buffer中内容写入redo log文件, 2.将db buf

重要Transaction Code

与客户相关  VD01 建立客户 Create customerVD02 更改客户 Change customerVD03 显示客户 Display customerVK11 创建条件 Create ConditionVK12 修改条件 Change ConditionVK13 显示条件 Display ConditionVA21 创建报价 Create QuotationVA22 更改报价 Change QuotationVA23 显示报价 Display QuotationVA01 创建销售

SAP MM t-code 全

事务码 描述(中英文) DPRL Change Material When Profile Deleted 删除参数文件时改变物料 DPRV Change Material When Profile Changed 修改参数文件时修改物料 MM00 物料主记录: 初始屏幕 物料主记录: 初始屏幕 MM01 Create Material - General 创建一般物料 MM02 Change Material 改变物料 MM03 Display Material 显示物料 MM04 Displ

网络爬虫讲解(附java实现的实例)

网络蜘蛛即Web Spider,是一个很形象的名字.把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页,从 网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止.如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来. 对于搜索引擎来说,要抓取互联网上所有的网页几乎是不可能的,从目前公布的数据

magento 12 配置安装教程

Magento (麦进斗) 是一套专业开源的电子商务系统.Magento设计得非常灵活,具有模块化架构体系和丰富的功能.易于与第三方应用系统无缝集成.其面向企业级应用,可处理各方面的需求,以及建设一个多种用途和适用面的电子商务网站. 包括购物.航运.产品评论等等,充分利用开源的特性,提供代码库的开发,非常规范的标准,易于与第三方应用系统无缝集成. 准备一: 下载址: 1 https://www.magentocommerce.com/products/downloads/magento/ 下载内

android视频播放的代码

本地视频播放,包括播放.暂停,继续等,还有显示播放的进度.效果如下: 1.activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tool