# PC SDK Cocos2d-x 따라하기

Cocos2d-x 기반 게임에 STOVE PC SDK 2.0을 적용하는 방법을 알아보는 따라하기 예제입니다.

confirm 따라하기 예제를 진행하기 전에 STOVE 런처 (opens new window)를 미리 설치하고 SDK 개발환경 준비하기를 참고하여 App key, App secret, Game Id를 발급받아 놔야 합니다.

# 따라하기 예제 소스코드 다운로드

아래 링크에서 따라하기용 HelloStove 프로젝트를 다운로드 합니다.

HelloStove 프로젝트는 Visual Studio 2015 Update 3에서 작성되었으며, Visual Studio 2019 에서도 정상 동작하는 것이 테스트되었습니다. 다운로드 받은 HelloStove 프로젝트는 STOVE PC SDK 연동방법을 순차적으로 설명하기 위한 소스코드이기 때문에 SDK와 연동되지 않은 상태입니다. 다음 설명부터 SDK 연동방법을 순차적으로 설명합니다.

# 프로젝트 환경 구성하기

  • STOVE PC SDK 다운로드 페이지에서, 최신 버전의 Native(C/C++) 배포 파일(이하 StovePCSDK로 표기)을 다운로드 합니다.
    다운로드된 StovePCSDK 파일의 압축을 푼 다음, HelloStove_Cocos2dx 폴더 하위에 복사합니다.

Figure1

비주얼 스튜디오를 실행하고 HelloStove_Cocos2dx\proj.win32 경로의 HelloStove_Cocos2dx.sln을 엽니다.

# 1) 추가 포함 디렉터리 설정

confirm 따라하기 예제는 win32/Release 환경을 기준으로 설명합니다. win32/Debug는 지원하지 않기 때문에 예제를 따라하는 경우 문제가 발생할 수 있습니다.

프로젝트 속성 페이지의 추가 포함 디렉터리StovePCSDK_{버전번호}/include 경로를 추가합니다.

$(SolutionDir)..\StovePCSDK_2.3.1\include
1

Figure2

# 2) 추가 라이브러리 디렉터리 설정

프로젝트 속성 페이지의 추가 라이브러리 디렉터리StovePCSDK_{버전번호}/bin 폴더 경로를 추가합니다.

$(SolutionDir)..\StovePCSDK_2.1.0\bin\$(Platform)\$(Configuration)
1

Figure3

# 3) 추가 종속성 설정

프로젝트 속성 페이지의 추가 종속성StovePCSDK.lib를 추가합니다.

StovePCSDK.lib
1

Figure4

# 4) 소스 파일에 StovePCSDK.h include 하기

HelloStove.cpp 파일을 열고 아래와 같이 #include "StovePCSDK.h"를 추가합니다.

#include "HelloStove.h"
#include "SimpleAudioEngine.h"

/*여기에 '따라하기' 코드를 추가합니다.*/
#include "StovePCSDK.h"
1
2
3
4
5

# 5) 빌드하기

비주얼 스튜디오의 빌드 메뉴에서 Release로 솔루션 빌드를 실행합니다. 모든 설정에 이상이 없다면 컴파일 에러 없이 정상적으로 빌드가 완료됩니다. 컴파일 에러가 발생하는 경우, 에러 메시지를 확인하고 경로 설정이나 프로젝트 환경 구성하기를 다시 점검해 봅니다.

# SDK 초기화

StovePCSDK를 초기화하려면 StovePCConfig구조체에 설정값을 채우고 StovePCCallback 구조체에 콜백함수를 연결해 준 다음, StovePC_Init 함수를 호출합니다.
아래 코드를 HelloStove::onClickedInit 함수에 작성합니다.

void HelloStove::onClickedInit(Ref* pSender)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/

    //config
    StovePCConfig config;
    memset(&config, 0, sizeof(StovePCConfig));

    config.env = "LIVE";
    config.appKey = "YOUR_APP_KEY";
    config.secretKey = "YOUR_SECRET_KEY";
    config.gameId = L"YOUR_GAME_ID";
    config.logLevel = StovePCLogLevel::STOVE_PC_LOG_LEVEL_DEBUG;
    config.logPath = L"";

    //callback
    StovePCCallback callback;
    memset(&callback, 0, sizeof(StovePCCallback));

    callback.OnError = OnError;
    callback.OnInitComplete = OnInitComplete;
    callback.OnToken = OnToken;
    callback.OnUser = OnUser;

    StovePCResult result = StovePC_Init(config, callback);
    if (result != StovePCResult::STOVE_PC_NO_ERROR)
    {
        std::string error = StringUtils::format("[ERROR] StovePC_Init, Result: %d", result);
        logOutput(LogType::LogError, error);
    }
    else
    {
        std::string success = "[OK] StovePC_Init";
        logOutput(LogType::LogSuccess, success);

        //StovePC_Init 함수 호출이 성공했으므로,
        //주기적으로 StovePC_RunCallback 함수를 호출합니다.
        schedule(schedule_selector(HelloStove::updateTimer), 1.0f);
    }
}
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

confirm
위 코드의 YOUR_APP_KEY, YOUR_SECRET_KEY, YOUR_GAME_ID는 STOVE Studio에서 사전에 등록한 ID와 Key값으로 변경해야 됩니다. 만약 STOVE Studio에 입점 신청한 스토브 계정으로 스토브 런처에 로그인 하지 않고 StovePC_Init 함수가 호출되면 150 에러코드(sgup 초기화 실패)가 발생합니다.

StovePC_Init 함수가 성공적으로 호출되면 STOVE_PC_NO_ERROR가 리턴됩니다. STOVE_PC_NO_ERROR가 성공적으로 리턴되면 타이머(Timer)를 통해 StovePC_RunCallback함수가 주기적으로 호출되도록 처리해야 합니다. 이러한 처리는 Cocos2d-x의 타이머인 schedule 함수로 1초마다 실행하는 콜백 HelloStove::updateTimer 함수를 설정하고 updateTimer함수 안에서 StovePC_RunCallback 함수가 주기적으로 실행되도록 합니다.

void HelloStove::updateTimer(float time)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
    StovePC_RunCallback();
}
1
2
3
4
5

StovePC_Init 함수가 정상적으로 실행되면 callback.OnInitComplete = OnInitComplete에 걸어놨던 콜백OnInitComplete 함수가 실행되며 이 함수의 주석을 풀고 아래 코드를 입력합니다.

void OnInitComplete()
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
    std::stringstream ss;
    ss << "<Init Complete>" << std::endl;

    // HelloStove예제 화면에 ss 텍스트를 표시한다
    GetHelloStove()->logOutput(LogType::LogNormal, ss.str(), 1);
}

1
2
3
4
5
6
7
8
9
10

StovePC_Init 함수, 또는 기타 다른 StovePCSDK 함수 호출이 실패했을 때 호출되는 콜백 OnError 함수의 주석을 풀고 아래 코드를 입력합니다.

void OnError(const StovePCError error)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
    std::stringstream ss;
    ss << "<Error>" << std::endl
        << error.functionType << std::endl
        << error.result << std::endl
        << error.message << std::endl
        << error.externalError << std::endl;

    GetHelloStove()->logOutput(LogType::LogError, ss.str(), 5);
}
1
2
3
4
5
6
7
8
9
10
11
12

# SDK 종료

StovePCSDK 함수의 모든 사용이 끝난 뒤에 StovePCSDK에서 사용중인 리소스를 정리하고 앞서 설정했던 타이머를 정지하기 위해 아래 코드를 HelloStove::onClickedUnInitialize 함수에 입력합니다.

void HelloStove::onClickedUnInitialize(Ref* pSender)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
    StovePCResult result = StovePC_UnInit();
    if (result != StovePCResult::STOVE_PC_NO_ERROR)
    {
        std::string error = StringUtils::format("[ERROR] StovePC_UnInit, Result: %d", result);
        logOutput(LogType::LogError, error);
    }
    else
    {
        unschedule(schedule_selector(HelloStove::updateTimer));
        std::string success = "[OK] StovePC_UnInit";
        logOutput(LogType::LogSuccess, success);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 사용자 정보 얻기

STOVE 런처를 통해 게임을 실행한 사용자 정보는 StovePCSDK의 StovePC_GetUser함수로 얻을 수 있습니다. 아래 코드를 HelloStove::onClickedGetUser 함수에 입력해서 StovePC_GetUser함수의 사용법을 확인해봅니다.

void HelloStove::onClickedGetUser(Ref* pSender)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
    StovePCResult result = StovePC_GetUser();
    if (result != StovePCResult::STOVE_PC_NO_ERROR)
    {
        std::string error = StringUtils::format("[ERROR] StovePC_GetUser, Result: %d", result);
        logOutput(LogType::LogError, error);
    }
    else
    {
        std::string success = "[OK] StovePC_GetUser";
        logOutput(LogType::LogSuccess, success);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

StovePC_GetUser 함수가 정상적으로 실행되면 콜백OnUser 함수가 호출되고 StovePCUser파라미터로 사용자 정보 획득이 가능합니다. 아래 코드를 통해 확인합니다.

void OnUser(const StovePCUser user)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
    std::stringstream ss;

    ss << "<UserInfo>" << "\n"   
        << " memberNo: " << user.memberNo << "\n"
        << " nickname: " << g_converter.to_bytes(user.nickname) << "\n"       
        << " gameUserId: " << user.gameUserId << "\n";

    GetHelloStove()->logOutput(LogType::LogNormal, ss.str(), 5);
}
1
2
3
4
5
6
7
8
9
10
11
12

# 토큰 정보 얻기

StovePC_GetToken함수는 토큰 정보를 얻어 올 때 사용합니다. 하단 코드를 HelloStove::onClickedGetToken 함수에 입력합니다.

confirm 토큰이란? STOVE 런처에 로그인된 사용자의 엑세스토큰(Access Token)으로 게임서버가 이 엑세스토큰을 스토브 인증서버로 전달해서 로그인한 사용자의 유효성 검증을 수행할 수 있습니다.
엑세스토큰에 대한 상세한 설명은 스토브 인디팀에 문의하기 (opens new window)로 기술지원을 받으시길 바랍니다.

void HelloStove::onClickedGetToken(Ref* pSender)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
    StovePCResult result = StovePC_GetToken();
    if (result != StovePCResult::STOVE_PC_NO_ERROR)
    {
        std::string error = StringUtils::format("[ERROR] StovePC_GetToken, Result: %d", result);
        logOutput(LogType::LogError, error);
    }
    else
    {
        std::string success = "[OK] StovePC_GetToken";
        logOutput(LogType::LogSuccess, success);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

StovePC_GetToken 함수가 정상적으로 호출되면 콜백OnToken함수에서 토큰값을 아래 코드로 확인해 볼 수 있습니다.

void OnToken(const StovePCToken token)
{
    /*여기에 '따라하기' 코드를 추가합니다.*/
    std::stringstream ss;
    ss << "<Token>" << "\n"
        << token.accessToken;

    GetHelloStove()->logOutput(LogType::LogNormal, ss.str(), 2);
}
1
2
3
4
5
6
7
8
9

# 빌드 및 실행

빌드가 완료된 HelloStove_Cocos2dx.exe 실행을 위해서는 StovePCSDK_{버전번호}\bin\Win32\Release 폴더의 동적라이브러리(DLL) 파일들을 HelloStove_Cocos2dx\proj.win32\Release.win32 폴더에 복사해야 합니다.

Figure5

파일 복사가 완료되면 스토브 런처를 실행하고 STOVE Studio에 가입한 ID로 로그인 합니다.

이제, 비주얼 스튜디오에서 F5를 눌러 HelloStove 프로젝트를 빌드하고 실행합니다. HelloStove 화면의 버튼을 순서대로 눌러 보면서 정상적으로 동작하는지 확인합니다.

Figure6

축하드립니다! StovePCSDK를 Cocos2d-x에 연동하기를 성공적으로 완료했습니다.

Last Updated: 2023. 8. 22. 오전 1:49:10