'팁&테크/Cocos2d-x'에 해당되는 글 3건

  1. 2015.09.24 Cocos2d-x 쓰레드 사용 시 참고(Scheduler::performFunctionInCocosThread)
  2. 2015.09.15 Locale 확인 시 중국과 대만이 구분되지 않는 부분
  3. 2015.09.11 Cocos2d-x 한글 지원
2015. 9. 24. 10:07

Cocos2d-x 쓰레드 사용 시 참고(Scheduler::performFunctionInCocosThread)

멀티 쓰레드를 사용할 경우 새로 생성한 쓰레드에서 Cocos 오브젝트에 접근하거나 사용할 수 없는 경우가 있는데


특히 소켓통신과 같이 별도의 쓰레드를 돌리는 경우 자주 발생한다.


(구분 편의상 코코스를 사용하는 쓰레드를 코코스 쓰레드, 새로 생성한 쓰레드를 서브 쓰레드라고 지칭하겠음.)


기존 2버전에서는 서브 쓰레드에서 코코스 오브젝트 작업을 할때 작업할 내용을 큐에 집어 넣고 코코스 쓰레드에서 빼와서 처리하는 식으로 했다고 하는데(2버전으로는 작업 안해봐서 모르겠음)


3버전에 들어와서는 Scheduler::performFunctionInCocosThread 메소드가 추가되었다.


메소드 명에서 보는 것처럼 서브 쓰레드에서 특정한 함수를 코코스 쓰레드에서 실행하게 하는 메소드 이다.


사용방법은 아래와 같음.


1. 메소드 호출 시

void ClassName::Method1() { auto scheduler = cocos2d::Director::getInstance()->getScheduler(); scheduler->performFunctionInCocosThread(CC_CALLBACK_0(ClassName::Method2, this)); } void ClassName::Method2() { //코코스 쓰레드로 실행할 내용 }

2. 람다함수 사용 시

void ClassName::Method1() { auto scheduler = cocos2d::Director::getInstance()->getScheduler(); scheduler->performFunctionInCocosThread([](void) -> void { //코코스 쓰레드로 실행할 내용 }); }








2015. 9. 15. 14:17

Locale 확인 시 중국과 대만이 구분되지 않는 부분

알다시피 중국과 대만의 locale 코드는 zh-CN 과 zh-TW 이다.

하지만 왜 이렇게 되있는지 모르겠지만 cocos2d는 앞자리인 zh 만으로 언어를 구분하도록 되어있어

플랫폼 별로 모든 소스를 다 고쳐야 제대로된 처리를 할 수 있다.



자바 플랫폼 변경방법 ----------------------------------------------------------------


설치 경로에 따라 다를수 있겠지만 아래 파일을 열어

/코코스설치경로/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java


public static String getCurrentLanguage() {

    return Locale.getDefault().getLanguage(); --> return Locale.getDefault().toString(); 

}


위와 같이 바꾸어주면 java쪽에서 ko-KR 같이 완전한 값을 리턴하게 된다.


그후에 cocos에서 호출하는 실제 getCurrentLanguage() 함수를 한번 더 수정해 줘야 하는데 위치는 아래 경로에 있다.


/코코스설치경로/cocos/platform/android/CCApplication-android.cpp


LanguageType Application::getCurrentLanguage()

{

    std::string languageName = getCurrentLanguageJNI();

    const char* pLanguageCode = languageName.c_str();

    const char* pLanguageName = getCurrentLanguageCode();

    LanguageType ret = LanguageType::ENGLISH;

    

    std::cout << languageName << std::endl;


    if (0 == strcmp("zh", pLanguageName))

    {

        if(0 == strcmp("zh-TW", pLanguageCode)

        {

            ret = LanguageType::TAIWAN; //  platform/CCCommon.h 파일에 추가해준다.

        }

        else 

        {

            ret = LanguageType::CHINESE;

        }

    }

   //이하 생략

}


ios 플랫폼 변경방법 ----------------------------------------------------------------

/코코스설치경로/cocos/platform/ios/CCApplication-ios.mm


LanguageType Application::getCurrentLanguage()

{

    // get the current language and country config

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSArray *languages = [defaults objectForKey:@"AppleLanguages"];

    NSString *currentLanguage = [languages objectAtIndex:0];


    // get the current language code.(such as English is "en", Chinese is "zh" and so on)

    NSDictionary* temp = [NSLocale componentsFromLocaleIdentifier:currentLanguage];

    NSString * languageCode = [temp objectForKey:NSLocaleLanguageCode];


    LanguageType ret = LanguageType::ENGLISH;

    if ([languageCode isEqualToString:@"zh"])

    {

       /** CHANGE THE FOLLOWING LINES */

        NSString* scriptCode = [temp objectForKey:NSLocaleScriptCode];

        NSString* countryCode = [temp objectForKey:NSLocaleCountryCode];

        // On iOS, either chinese hong kong or chinese taiwan are traditional chinese.

        if ([scriptCode isEqualToString:@"Hant"] || [countryCode isEqualToString:@"HK"]) {

            ret = LanguageType::TAIWAN;  // You need to add these enum values to LanguageType

        } else {

            ret = LanguageType::CHINESE;  // You need to add these enum values to LanguageType

        }

    }

   //이하생략

}





Win32 플랫폼 변경방법 ----------------------------------------------------------------

/코코스설치경로/cocos/platform/win32/CCApplication-win32.cpp


LanguageType Application::getCurrentLanguage()

{

    LanguageType ret = LanguageType::ENGLISH;

    

    LCID localeID = GetUserDefaultLCID();

    unsigned short primaryLanguageID = localeID & 0xFF;

    

    switch (primaryLanguageID)

    {

        case LANG_CHINESE:

        {

            if(localeID == 0x404 || localeID == 0xC04) //대만, 홍콩

                ret = LanguageType::TAIWAN;

            else

                ret = LanguageType::CHINESE;

        }

    }

}

GetUserDefaultLCID() 반환코드 관련

https://support.microsoft.com/ko-kr/kb/193080

https://msdn.microsoft.com/en-us/goglobal/bb964664.aspx






















2015. 9. 11. 18:28

Cocos2d-x 한글 지원

한글이 깨져나와서 해결 방법을 찾아보았는데


기존에 많이 알려져 있는 CDevice.cpp 나 CConsole.cpp 파일의 CP_UTF8 -> CP_ACP 수정 방법은 ANSI 코드로만 출력하도록 고정하는 방법이므로 다국어 지원이 필요한 환경에서는 사용하지 않는것이 좋다.


문제의 원인은 Visual Studio 의 컴파일 방식인데 소스코드를 UTF-8로 작성하였다 하더라도 실행 파일에 포함된 문자 리터럴은 ANSI 로 처리가 되어 발생하는 문제임.


C++ 11 에서는 문자열 앞에 u8을 붙이는 것으로 문자열이 UTF-8임을 지정할 수 있도록 되어있지만 Visual Studio 2013은 지원하지 않음


UTF-8문자열을 사용하는 소스의 헤더파일에 아래코드를 추가하여 고정하면 글자가 정상적을 출력이 됨


#pragma execution_character_set("utf-8")