티스토리 뷰

Game/Cocos2d-x

[분석] 1. 시작하기

유승구 2012. 4. 16. 17:46

1. Visual Studio 2008 을 이용합니다.

2. 개발환경은 타 블로그를 활용 해주십시오.

3. cocos2d-win32.vc2008.sln을 열어 test 프로젝트를 분석합니다.

4. 질문은 언제든지 환영합니다.


오픈 소스의 강점을 살려 개인적인 스킬도 올릴겸 시작을 합니다. Android 폰을 개발하는 업무를 맡고 있어 게임 제작쪽과는 전혀 상관이 없는 사람임을 밝힙니다. 순수하게 이런걸 즐깁니다. :-)


소스 분석




test 프로젝트를 열면 classes 폴더와 win32 폴더가 있습니다. main이라 붙은 내용이 언제나 시작을 알리는 부분이므로 먼저 열어봤습니다. win32 기반이므로 반갑게도 _tWinMain() 함수가 있습니다. 이쪽부터 시작함을 확인 할 수 있었습니다. 인자나 기타 자세한 내용은 검색해보면 그대로 나오므로 넘어갑니다.


<Header file> main.h 

------------------------------------------------------

다른 특이한 점은 없으며 아래 헤더파일을 include 합니다.

C에 관한 헤더 파일인데 Time에 관한 내용이 기술되어있습니다.


// C RunTime Header Files

#include "CCStdC.h"


<CPP file> main.cpp

-------------------------------------------------------

첫 줄부터 시작하겠습니다.  #include "AppDelegate.h"가 있습니다.


AppDelegate.h

- CCAplication을 상속받은 클래스입니다.

- CCApplication.h를 include 하고 있습니다.


CCApplication.h

- 플랫폼별 Header 파일을 다시 체크합니다.

- 내부적으로 CCApplication_platform.h를 include 합니다.


CCApplication_playform.h

#include "CCPlatformConfig.h"

- 플랫폼별 Define 값을 처리해주고 있습니다.


#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)

    #include "win32/CCApplication_win32.h"

#elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

    #include "android/CCApplication_android.h"

#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

    # include "ios/CCApplication_ios.h"

#else

    #error

#endif


사용되는 플랫폼에 따라 헤더파일을 로드합니다.


CCApplication_win32.h

- 다양하게 많은 기본 셋팅을 처리 합니다.(static, 상수라던지 define 값이라던지~~)

- static으로 sharedApplication() 함수를 정의 합니다.


==> 헤더 처리는 끝이나고.. 이제 본격적으로 _tWinMain() 내부의 2줄을 보겠습니다.


main.cpp

// create the application instance

AppDelegate app;

AppDelegate 클래스의 인스턴스를 생성합니다.


return cocos2d::CCApplication::sharedApplication().run();

방금 이야기 했던 static 함수인 sharedApplication()을 이용해 CCApplication의 객체를 읽어 들이고 run을 실행시킵니다.


run() 코드를 좀 살펴보겠습니다.

MSG 처리를 하고 있어 상단 소스는 다 자릅니다. 


    // Initialize instance and cocos2d.

    if (! initInstance() || ! applicationDidFinishLaunching())

    {

        return 0;

    }


이 부분에서 appdelgate 클래스 부분을 열심히 호출 합니다. 왜 그러냐면... virtual 메소드이므로 호출 호출 호출을 하다보면 AppDelegate로 가게 됩니다....(설명이 길어지니 짧게...)


[보충]

AppDelegate 헤더파일을 셋팅 하면서 CCAplication을 상속받은 AppDelegate의 Static 멤버들의 선언이 이루어집니다. 이로 인해 CCApplication sharedApplication은 내부적으로 AppDelegate 클래스를 참조하게 됩니다. 


이렇게 해서 AppDelegate의 initInstance와 applicationDidFinishLaunching이 호출 됩니다.


잠시 AppDelegate.cpp로 넘어가게 되었는데요.. 내부적으로 보면 initInstance()에서는 윈도우 타이틀과 크기를 설정해줍니다. 플랫폼 별로요. 그리고 applicationDidFinishLaunching()에서는 Director를 새로 생성하고 GLView(Coltroller.cpp안에 있는 testController 클래스를 생성한)를 할당합니다. FPS를 표시하도록 설정하고 애니매이션은 1/60초로 돌립니다.

Scene 전환을 위한 node도 생성하고 layer도 만들어 줍니다.


그리고서~ 표시해줄 Scene을 할당해주고 끝.


    CCEGLView& mainWnd = CCEGLView::sharedOpenGLView();

    mainWnd.centerWindow();

    ShowWindow(mainWnd.getHWnd(), SW_SHOW);


이제 만들어진 GLView를 mainWindow로 등록하고 이를 나타냅니다.

윈도우상에 우리가 테스트 윈도우가 생성된 겁니다.

그리곤 이제 계속 뿌려줘야 하니까 무한 루푸~!


    while (1)

    {

메세지를 받아서 처리해야 하므로 아래 처리를 실행시켜줍니다.

내부적으로 디렉터가 보이는데 이는 다음에 더 분석해서 보도록 하겠습니다.


        if (! PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

        {

            // Get current time tick.

            QueryPerformanceCounter(&nNow);


            // If it's the time to draw next frame, draw it, else sleep a while.

            if (nNow.QuadPart - nLast.QuadPart > m_nAnimationInterval.QuadPart)

            {

                nLast.QuadPart = nNow.QuadPart;

                CCDirector::sharedDirector()->mainLoop();

            }

            else

            {

                Sleep(0);

            }

            continue;

        }


        if (WM_QUIT == msg.message)

        {

            // Quit message loop.

            break;

        }


        // Deal with windows message.

        if (! m_hAccelTable || ! TranslateAccelerator(msg.hwnd, m_hAccelTable, &msg))

        {

            TranslateMessage(&msg);

            DispatchMessage(&msg);

        }

    }


    return (int) msg.wParam;

}


아~ 역시 이렇게 작성해가면서 쓰면 정말 좋군요. Director를 만들어 mainLoop()를 계속 돌려주는 군요..

싱글톤 패턴이 많이 사용된 것 같습니다.


이렇게 해서 가장 처음 어떤식으로 구동되는지 확인을 했습니다. 

지속적으로 Sample과 원 소스를 분석해가도록 하겠습니다.


감사합니다.


'Game > Cocos2d-x' 카테고리의 다른 글

[분석] 3. ActionTest  (0) 2012.04.18
[분석] 2. SCene 전환  (0) 2012.04.17
[분석] 1. 시작하기  (2) 2012.04.16
댓글
  • 프로필사진 손님 위에 main.h에 #include "CCStdC.h"를 열수없다고 에러가 나는데~혹시 이런에러 못보셨나요? 2012.11.05 15:30
  • 프로필사진 Favicon of https://starkapin.tistory.com BlogIcon 유승구 저는 없었습니다. ㅎ 솔루션을 그대로 사용하면 되었습니다. CCStdC.h는 빌드 패스를 한번 의심해보는게 좋을 것 같습니다. 2012.11.07 19:59 신고
댓글쓰기 폼