성 징계 없이 SpriteBuilder를 사용하는 분들에게

소개



이 기사를 본 사람.
어쩌면 나와 같고 옛날 냄새 기술을 사용하고 있는 분이겠지요.

사실이라면 cocos2d-xUnity 등으로 개발하고 싶은 곳이 Swift를 사용하고 싶기 때문에 등에서 SpriteBuilder를 사용하고 있을까 생각합니다.
※다른 기술을 기억하는 것이 귀찮다고 하는 분도 있다고 생각합니다만・・・w
(이제 Unity의 1인승의 생각도 하고 있습니다만···. 유감입니다.)

나 개인적으로는 SpriteBuilder 은 꽤 명기라고 생각하고 있습니다만, 스폰서가 빠졌기 때문인지 갱신은 멈추어 AppStore로부터도 삭제되었습니다.
매우 유감입니다.

저도 현재 만들고 있는 게임을 마지막으로 SpriteBuilder를 그만두겠습니다만, 이번에는 무리하게 사용하려고 합니다.
그 때에 문제가 되는 부분을 여기에 기재해 둡니다.

화면 전환



iOS9・・・라고 할까, Capitan 로부터 이하의 코드가 떨어지게 되었습니다.
(xCode 버전 때문일지도 모른다. 어쨌든 최신이라고 떨어진다.)

CCTransition.m
-(void)draw:(CCRenderer *)renderer transform:(const GLKMatrix4 *)transform
{
    typedef id (*Func)(id, SEL);
    ((Func)objc_msgSend)(self, _drawSelector);

}

이 부분은 다음과 같이 다시 쓰면 움직입니다.

CCTransition.m
-(void)draw:(CCRenderer *)renderer transform:(const GLKMatrix4 *)transform
{
//  typedef id (*Func)(id, SEL);
//  ((Func)objc_msgSend)(self, _drawSelector);

    void (*Func)(id, SEL) = (void(*)(id, SEL)) objc_msgSend;
    Func(self, _drawSelector);
}

일본어 대응



iOS9에서 [NSLocale preferredLanguages] 반환 값이 변경됩니다.
그 때문에 독자적으로 언어 관리를 하고 있던 서비스는 처마英語가 되거나 떨어지거나 하고 있습니다.
(파이널 판타지 등의 메이저커녕조차 대응에 힘쓰고 있던 것을 알고 있는 분도 있을 것입니다.)
SpriteBuilder도 마찬가지입니다.
최신 Cococs2d 코드를 보면 개선되었지만 여전히 불완전했기 때문에 나는 다음과 같이 대응했습니다.

Source/libs/cocos2d-iphone/cocos2d-ui/CCBReader/CCBLocalizationManager.m
- (void) loadStringsFile:(NSString*) file
{
    // Load default localization dictionary
    NSString* path = [[CCFileUtils sharedFileUtils] fullPathForFilename:file];

    // Load strings file
    NSDictionary* ser = [NSDictionary dictionaryWithContentsOfFile:path];

    // Check that format of file is correct
    NSAssert([[ser objectForKey:@"fileType"] isEqualToString:@"SpriteBuilderTranslations"], @"Invalid file format for SpriteBuilder localizations");

    // Check that file version is correct
    NSAssert([[ser objectForKey:@"fileVersion"] intValue] == 1, @"Translation file version is incompatible with this reader");

    // Load available languages
    NSArray* languages = [ser objectForKey:@"activeLanguages"];

    // Determine which language to use
    NSString* userLanguage = NULL;

    NSArray* preferredLangs = [NSLocale preferredLanguages];
    for (NSString* preferredLang in preferredLangs)
    {
        if ([languages containsObject:preferredLang])
        {
            userLanguage = preferredLang;
            break;
        }
    }

    // Create dictionary for translations
    _translations = [[NSMutableDictionary alloc] init];

    // Load translations
    if (userLanguage != NULL)
    {
        NSArray* translations = [ser objectForKey:@"translations"];

        for (NSDictionary* translation in translations)
        {
            NSString* key = [translation objectForKey:@"key"];
            NSString* value = [(NSDictionary*)[translation objectForKey:@"translations"] objectForKey:userLanguage];

            if (key != NULL && value != NULL)
            {
                [_translations setObject:value forKey:key];
            }
        }
    }
}

이 메소드를 다음과 같이 변경합니다.

Source/libs/cocos2d-iphone/cocos2d-ui/CCBReader/CCBLocalizationManager.m
- (void) loadStringsFile:(NSString*) file
{
    // Load default localization dictionary
    NSString* path = [[CCFileUtils sharedFileUtils] fullPathForFilename:file];

    // Load strings file
    NSDictionary* ser = [NSDictionary dictionaryWithContentsOfFile:path];

    // Check that format of file is correct
    NSAssert([[ser objectForKey:@"fileType"] isEqualToString:@"SpriteBuilderTranslations"], @"Invalid file format for SpriteBuilder localizations");

    // Check that file version is correct
    NSAssert([[ser objectForKey:@"fileVersion"] intValue] == 1, @"Translation file version is incompatible with this reader");

    // Load available languages
    NSArray* languages = [ser objectForKey:@"activeLanguages"];

    // Determine which language to use
    NSString* userLanguage = NULL;

    NSArray* preferredLangs = [NSLocale preferredLanguages];
    for (NSString* preferredLang in preferredLangs)
    {
        // now loop thru languages from our cocosbuilder
        for (NSString *localizedLanguage in languages)
        {
            // doing range of string as we might have en-GB set in our phone and that will match our en from the activeLanguages
            if ([preferredLang rangeOfString:localizedLanguage].location != NSNotFound)
            {
                userLanguage = localizedLanguage;
                break;
            }
        }

        if (userLanguage != NULL) {
            break;
        }
    }

    // Create dictionary for translations
    _translations = [[NSMutableDictionary alloc] init];

    // Load translations
    if (userLanguage != NULL)
    {
        NSArray* translations = [ser objectForKey:@"translations"];

        for (NSDictionary* translation in translations)
        {
            NSString* key = [translation objectForKey:@"key"];
            NSString* value = [(NSDictionary*)[translation objectForKey:@"translations"] objectForKey:userLanguage];

            if (key != NULL && value != NULL)
            {
                [_translations setObject:value forKey:key];
            }
        }
    }
}

이제 SpriteBuilder에서 언어를 관리할 수 있습니다.

워닝



어쨌든 경고가 오로지 나옵니다.
이하의 워닝이 30개 정도 나옵니다.
ld: warning: object file (/.../Build/Products/Debug-iphonesimulator/libcocos2d.a(IOSVersion.o)) was built for newer iOS version (9.3) than being linked (8.0)

이것은 여기의 링크대로, 이하의 대응을 하면 워닝이 나오지 않게 됩니다.
The culprit is the minimum deployment target for the ObjectAL library - 
In Xcode delve into the cocos2d project -> external -> ObjectAL project: 
Goto build settings and search for 'deployment target' 
and set the value to be <= your main project minimum deployment target.

위와 같이

"cocos2d project -> external -> ObjectAL"폴더를 따라 가서 "build settings"를 표시합니다.
그 중 'deployment target'을 자신의 프로젝트에 맞춘 최소 타겟으로 하면 OK입니다.

마지막으로



나는 최근 거짓 이야기이라는 게임을 만들었습니다.
그 자산을 사용하고 싶기 때문에, 이번은 이대로 돌진하기로 했습니다.

그래서, 이 기사에서는 곤란한 것을 여기에 추기해 가려고 생각하고 있습니다.
같은 SpriteBuilder에서 곤란한 분은 꼭 스톡 & 코멘트 부탁드립니다.
몇 안 되는 SpriteBuilder 를 사용하고 있는 동지끼리로 노력합시다! w

그건 그렇고, 거짓 이야기의 스크린 샷은 이런 느낌입니다.
좋으면 놀아주세요 ♪



TownSoft



저는 TownSoft이라는 옥호에서 일하고 있으므로, 뭔가 있으면 연락주십시오.

좋은 웹페이지 즐겨찾기