Межстрочный интервал в CCLabelTTF - PullRequest
5 голосов
/ 22 октября 2011

Есть ли в приложении ios возможность настроить расстояние между несколькими строками в CCLabelTTF в cocos2d? Спасибо

Ответы [ 4 ]

4 голосов
/ 02 декабря 2011

Ответ на ваш вопрос - нет. Вы не можете настроить межстрочный интервал CCLabelTTF. Но эй! Я поделюсь с вами своим решением для этого;)

Это .h

#import <Foundation/Foundation.h>
#import "cocos2d.h"

@interface CCLabelTTFLineSpaced : CCLayer {
}

+ (id) labelWithString:(NSString*)string dimensions:(CGSize)dimensions alignment:(CCTextAlignment)alignment fontName:(NSString*)name fontSize:(CGFloat)size lineSpace:(CGFloat)space;

- (id) initWithString:(NSString*)str dimensions:(CGSize)dimensions alignment:(CCTextAlignment)alignment fontName:(NSString*)name fontSize:(CGFloat)size lineSpace:(CGFloat)space;

@end

И это .m

#import "CCLabelTTFLineSpaced.h"

@implementation CCLabelTTFLineSpaced

+ (id) labelWithString:(NSString*)string dimensions:(CGSize)dimensions alignment:(CCTextAlignment)alignment fontName:(NSString*)name fontSize:(CGFloat)size lineSpace:(CGFloat)space{
    return [[[self alloc] initWithString: string dimensions:dimensions alignment:alignment fontName:name fontSize:size lineSpace:(CGFloat)space]autorelease];
}

- (id) initWithString:(NSString*)str dimensions:(CGSize)dimensions alignment:(CCTextAlignment)alignment fontName:(NSString*)name fontSize:(CGFloat)size lineSpace:(CGFloat)space{
    if( (self=[super init]) ) {
        anchorPoint_ = ccp(0.5f, 0.5f);
        [self setContentSize:dimensions];
        self.isRelativeAnchorPoint = NO;

        int pos = 0;
        int i = 0;
        while (pos<[str length]) {
            int end = 0;
            int lastCut = -1;
            bool finished=NO;
            while (finished==NO) {
                CGSize actualSize = [[str substringWithRange:NSMakeRange(pos, end)] sizeWithFont:[UIFont fontWithName:name size:size]];

                if (actualSize.width > dimensions.width || pos+end == [str length]) {
                    if (pos+end == [str length] && actualSize.width <= dimensions.width) lastCut = end;
                    finished=YES;
                }
                else {
                    if ([[str substringWithRange:NSMakeRange(pos+end, 1)] isEqualToString:@" "] || [[str substringWithRange:NSMakeRange(pos+end, 1)] isEqualToString:@"."] || [[str substringWithRange:NSMakeRange(pos+end, 1)] isEqualToString:@","]) {
                        lastCut = end;
                    }
                    end++;
                }
              }

            NSString * strLine = [str substringWithRange:NSMakeRange(pos, lastCut)];

            CCLabelTTF * line = [CCLabelTTF labelWithString:strLine dimensions:CGSizeMake(dimensions.width, size*2) alignment:alignment fontName:name fontSize:size];
            [line setAnchorPoint:ccp(0,1)];
            [line setPosition:ccp(0,-i*space)];
            [self addChild:line];

            pos=pos+lastCut;
            i++;
        }
    }
    return self;
}
@end

Прост в использовании;) Я должен закончить урок геттерами, сеттерами и всем прочим. Я знаю, что это "домашнее" решение, но эй! Это работает!

0 голосов
/ 20 апреля 2014

Я думаю, что это проблема, на которую наткнулись многие разработчики Cocos2d.Поэтому для улучшения читаемости и совместной работы над этим классом я создавал репозиторий для Github.

Вот ссылка

Я начал с версии @gmoagames (и @Hardschool), добавил метод setColor: из @Alex и добавил метод вfade the opacity.

Не стесняйтесь присылать мне любые запросы на слияние, если у вас есть какие-то улучшения.

И большое спасибо за весь код, который был предоставлен здесь.

0 голосов
/ 18 октября 2012

gmogames, вот setColor, например

void CCLabelTTFLineSpaced::setColor(ccColor3B color)
{
    for (int i = 0; i < getChildren()->count(); i ++)
    {
        CCLabelTTF* child = (CCLabelTTF*)getChildren()->objectAtIndex(i);
        child->setColor(color);
    }
}
0 голосов
/ 02 октября 2012

Для тех, кто использует Cocos 2d 2.x, я изменил код @Hardschool, чтобы исправить устаревшие методы, и он работает потрясающе!

в .ч

#import <Foundation/Foundation.h>
#import "cocos2d.h"

@interface CCLabelTTFLineSpaced : CCLayer {
}

+ (id) labelWithString:(NSString*)string dimensions:(CGSize)dimensions hAlignment:  (CCTextAlignment)alignment fontName:(NSString*)name fontSize:(CGFloat)size lineSpace:(CGFloat)space;

- (id) initWithString:(NSString*)str dimensions:(CGSize)dimensions hAlignment:(CCTextAlignment)alignment fontName:(NSString*)name fontSize:(CGFloat)size lineSpace:(CGFloat)space;

@end

в файле .m

#import "CCLabelTTFLineSpaced.h"


@implementation CCLabelTTFLineSpaced

+ (id) labelWithString:(NSString*)string dimensions:(CGSize)dimensions hAlignment:(CCTextAlignment)alignment fontName:(NSString*)name fontSize:(CGFloat)size lineSpace:(CGFloat)space{
return [[[self alloc] initWithString: string dimensions:dimensions hAlignment:alignment fontName:name fontSize:size lineSpace:(CGFloat)space]autorelease];
}

- (id) initWithString:(NSString*)str dimensions:(CGSize)dimensions hAlignment:(CCTextAlignment)alignment fontName:(NSString*)name fontSize:(CGFloat)size lineSpace:(CGFloat)space{
if( (self=[super init]) ) {
    anchorPoint_ = ccp(0.5f, 0.5f);
    [self setContentSize:dimensions];
    self.ignoreAnchorPointForPosition = YES;

    int pos = 0;
    int i = 0;
    while (pos<[str length]) {
        int end = 0;
        int lastCut = -1;
        bool finished=NO;
        while (finished==NO) {
            CGSize actualSize = [[str substringWithRange:NSMakeRange(pos, end)] sizeWithFont:[UIFont fontWithName:name size:size]];

            if (actualSize.width > dimensions.width || pos+end == [str length]) {
                if (pos+end == [str length] && actualSize.width <= dimensions.width) lastCut = end;
                finished=YES;
            }
            else {
                if ([[str substringWithRange:NSMakeRange(pos+end, 1)] isEqualToString:@" "] || [[str substringWithRange:NSMakeRange(pos+end, 1)] isEqualToString:@"."] || [[str substringWithRange:NSMakeRange(pos+end, 1)] isEqualToString:@","]) {
                    lastCut = end;
                }
                end++;
            }
          }

        NSString * strLine = [str substringWithRange:NSMakeRange(pos, lastCut)];

        CCLabelTTF * line = [CCLabelTTF labelWithString:strLine dimensions:CGSizeMake(dimensions.width, size*2) hAlignment:alignment fontName:name fontSize:size];
        [line setAnchorPoint:ccp(0,1)];
        [line setPosition:ccp(0,-i*space)];
        [self addChild:line];

        pos=pos+lastCut;
        i++;
    }
}
return self;
}
@end

Вот и все, спасибо @Hardschool!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...