2017_7_8 ) 프로젝트 만들자마자 실행하면 어떻게 흘러갈까?
main.cpp 에서
AppDelegate app; 을 만들면 생성자 호출. 허나 내용은 없음.
다만, AppDelegate.h에서 AppDelegate 클래스를 살펴보면 cocos2d::Application 클래스를 상속받음을 알 수 있다.
그래서 CCApplication-win32.cpp에서 Application() 생성자 실행.
근데 사실 이 부분은 잘 모르겠다. xutility랑 xstring 파일의 내용도 왔다갔다 실행됨.
확실한건 sm_pSharedApplication 라는 application 포인터에 현재 내용을 넣어서 뭘 한다는거 정도..?
그리고 다시 main.cpp로 돌아와서
return Application::getInstance()->run(); 실행
CCApplication-win32.cpp의 getInstance()
cc_assert 함수로 sm_pSharedApplication를 진단한 후
sm_pSharedApplication를 그대로 리턴해줌.
그리고는 run()을 실행. 역시 CCApplication-win32.cpp.
솔직히 내용은 잘 모르겠음.
단 AppDelegate.cpp의 applicationDidFinishLaunching()가 호출되고 거기서 창이 뜸(내용은 X)
그리고 그 안에서
auto scene = HelloWorld::createScene();
HelloWorld.Scene.cpp로 옴.
Scene* HelloWorld::createScene() 함수에서
return HelloWorld::create(); 을 실행.
HelloWorldScene.h 에서
CREATE_FUNC(HelloWorld);
HelloWorld를 create해주는 거라는데 잘 모르겠고 다시 HelloWorld.Scene.cpp의 HelloWorld::init() 실행.
if ( !Scene::init() )으로 이미 이니셜라이징 되어있는건 아닌지 확인.
auto visibleSize = Director::getInstance()->getVisibleSize(); // getVisibleSize()는 openGL view 상에서의 visible size를 리턴.
Vec2 origin = Director::getInstance()->getVisibleOrigin(); // getVisibleOrigin()은 openGL 상의 visible origin coordinate를 리턴. Vec2로 리턴해준다는 모양.
auto closeItem = MenuItemImage::create("CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
//MenuItemImage의 create() 함수에서 첫번째 인수는 메뉴에서 사용하려는 이미지, 두번쨰 인수를 버튼이 눌려졌을 때 사용될 이미지, 3번째는 콜백 함수의 첫 번째 인자 (메뉴가 탭됐을 때 호출되어야 할 함수), 4번째는 콜백 함수의 두 번째 인자 (메뉴가 눌렸을 때 반응해야 하는 객체. 위의 this는 메뉴가 생성된 장면을 참조.
여기서 클릭 시 menuCloseCallback 함수가 호출되어
Director::getInstance()->end();
해서 종료되는 모양.
closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
origin.y + closeItem->getContentSize().height/2));
//closeItem의 위치를 잡아줌
auto menu = Menu::create(closeItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu, 1);
//메뉴 생성!
auto label = Label::createWithTTF("Hello World ㅎㅇㅎㅇ", "fonts/08SeoulNamsanM_0.ttf", 24);
//레이블 추가. 할 말, 폰트 경로, 사이즈 순으로 인수를 넣었다.
label->setPosition(Vec2(origin.x + visibleSize.width/2,
origin.y + visibleSize.height - label->getContentSize().height));
//레이블 위치 설정.
this->addChild(label, 1);
//레이블을 자식으로 넣는다는듯
auto sprite = Sprite::create("HelloWorld.png");
sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
//화면 가운데 그림을 넣어줌
this->addChild(sprite, 0);
//얘도 자식으로 넣음. 왜 얘는 0이고 위에는 1인지는 알아봐야 할 것 같음. Z order drawing priority 문제라는데 아마 레이어가 여러개일 떄 어느게 위고 어느게 아래냐 같은 문제가 아닌가 추측됨.
다시 한참 전의 AppDelegate.cpp로 돌아가서
director->runWithScene(scene); // 실행
그리고 CCApplication-win32.cpp 로 돌아와서
while(!glview->windowShouldClose()) 루프 안에서 화면이 뜨기 시작.