zoukankan      html  css  js  c++  java
  • 对CCLabelTTF进行自动换行,显示打字效果(转)

    有时候我们在开发cocos2d游戏的时候,会用到任务的对话,或者在做任务的时候跟npc进行对话。这几天正好项目需要,就写了个简单的label,效果就是我们打字一样,一个一个显示出来,自动换行。在我这个例子中,我把总的行数限定4行,根据这个先决条件写了下面的几行代码,仅供参考!!


    ary = [NSMutableArray arrayWithCapacity:20];

    [ary retain];

    int length = [copyStr length];

    int line = 1; // 必须要有一行

    int wordCount = 0; // 标记第几个字

    for (int i = 0; i < length; i++) 

    {

    // 发现回车行数加1

    if ([copyStr characterAtIndex:i] == '\n') 

    {

    line++;

    //NSLog(@"subStr === %@",[copyStr substringToIndex:i]);

    [ary addObject:[copyStr substringToIndex:i]];

    //NSLog(@"剩余的字符串:%@",[copyStr substringFromIndex:i+1]);

    copyStr = [copyStr substringFromIndex:i+1];

    length = [copyStr length];// 截取了回车之前的部分之后,就要从新计算剩余字符串的长度

    wordCount = 0;

    i = 0;

    }

    if (wordCount*14 > 300) 

    {

    line++;

    //NSLog(@"第一次截取 :%@",[copyStr substringToIndex:wordCount]);

    [ary addObject:[copyStr substringToIndex:wordCount]];

    copyStr = [copyStr substringFromIndex:wordCount];

    //NSLog(@"省下的 === %@",copyStr);

    length = [copyStr length];

    if (length < kTextCount) 

    {

    [ary addObject:copyStr];

    }

    //NSLog(@"省下的长度 === %d",length);

    wordCount = 0// 如果发现,到某个字的时候,总的宽度大于了300我们就要手动换行,然后从新开始记数

    i = 0; // 从新开始循环变量也要归0

    }

    //NSLog(@"i == %d",i);

    wordCount++;

    }

    //CGSize size = [kString sizeWithFont:[UIFont fontWithName:@"Arial-BoldMT" size:14] constrainedToSize:CGSizeMake(300, 1000) lineBreakMode:UILineBreakModeWordWrap];

    //[self schedule:@selector(setSubString:) interval:0.03];

    }

    NSMutableArray* array = [NSMutableArray arrayWithCapacity:10];

    NSMutableString* mStr = [[NSMutableString alloc] init];

    int lineCount = 0;

    int maxLine = [ary count];

    // 4句话合成一句话

    for(NSString* str in ary)

    {

    [mStr appendString:str];

    lineCount++;

    if(lineCount%4==0||lineCount>=maxLine)

    {

    [array addObject:[NSString stringWithFormat:@"%@",mStr]];

    [mStr deleteCharactersInRange:NSMakeRange(0, [mStr length])];

    }

    }

    // 获取完之后,由于从新组合了数组,我们把这哥ary清空,从新放入新数组中的对象,就是一个方便

    [ary removeAllObjects];

    for (int n = 0; n < [array count]; n++) 

    {

    //NSLog(@"array[%d] == %@",n,[array objectAtIndex:n]);

    [ary addObject:[array objectAtIndex:n]];

    }

    // 标记重新组合的字符串在数组中的索引

    printID = 0;

    [self nextPrint];

    return self;

    }


    -(void)nextPrint

    {

    // 标记搜索到的字符数

    printIndex = 0;

    strPrint = [ary objectAtIndex:printID];

    // 求拿出来的字符串的长度

    maxPrint = [strPrint length];

    printID++;

    [self schedule:@selector(print:) interval:0.05];

    }


    -(void)print:(ccTime)step

    {

    printIndex++;

    [self printString:strPrint index:printIndex];

    if(printIndex>=maxPrint)

    {

    [self unschedule:_cmd];

    if (printID < [ary count]) 

    {

    [self nextPrint];

    }

    }

    }



    -(void)printString:(NSString*)str index:(int)index

    {


    [label setString:[str substringToIndex:index]];

    }

  • 相关阅读:
    Rancher2.x部署K8s
    windows 安装 rabbitmq
    Mysql优化
    Docker部署Nginx应用(2)
    Docker入门笔记(1)
    kafka的安装及基本使用
    Dubbo的Api+Provider+Customer示例(IDEA+Maven+Springboot+dubbo)
    zookeeper 数据节点的增删改查
    zookeeper伪分布集群配置
    密集重建
  • 原文地址:https://www.cnblogs.com/pinping/p/2244099.html
Copyright © 2011-2022 走看看