지금까지는 게임화면을 만드는 것에만 집중했었는데요. 이번에는 화면을 전환하는 방법에 대해 확인해보겠습니다. 일반적으로 'Scene'이라고 부르는데요. 게임을 진행하던 HelloWorldScene과는 달리, 초기화면을 구성하는 Scene을 만들어보겠습니다. 이 두 개의 Scene은 완전히 대등한 관계라고 할 수 있는데요. 마치 한 장면 장면이 연결되어 한 편의 드라마나 영화가 되는 것처럼, 게임 또한 여러 장면을 구성하고 장면들을 연결하여 하나의 게임을 완성할 수 있습니다.
- 13 - 화면 전환
1. 초기화면 구성
게임을 구성하는 장면은 아주 다양합니다. 실제 게임을 진행하는 장면도 있고, 게임을 처음 켰을 때 나오는 회사마크도 장면이라고 할 수 있고요. 초기 메뉴도 장면, 게임이 종료되고 점수가 나오는 장면, 순위를 매기는 장면 등, 게임을 만드는 사람이 자유롭게 장면들을 만들 수 있지요.
여기서는 Opening 화면과 지금까지 만들었던 게임화면 두 개로 구성하고, Opening 화면을 처음 보여주고, 여기서 화면을 클릭하면 게임화면으로 넘어가게 구성해보겠습니다.
/Classes/OpeningScene.h
#ifndef __OPENING_SCENE_H__ #define __OPENING_SCENE_H__ #include "cocos2d.h" #include "HelloWorldScene.h" using namespace cocos2d; class Opening : public cocos2d::CCLayer { private: CCSize _screenSize; public: // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::CCScene* scene(); // implement the "static node()" method manually CREATE_FUNC(Opening); void createGameScene(void); void changeScene(void); virtual void ccTouchesBegan(CCSet* pTouches, CCEvent* event); ~Opening(void); }; #endif // __OPENING_SCENE_H__
처음 HelloWorldScene 파일을 만들 때와 동일하게 class를 구성합니다. createGameScene() 함수에서 기본적인 게임 정보를 초기화하고요. changeScene()으로 실제 화면을 전환합니다. 터치를 하는 순간 화면을 바꿀 생각이기 때문에 ccTouchesBegan()만 있으면 될 것 같습니다. 그러면 실제 구현 부분을 확인해보겠습니다.
/Classes/OpeningScene.cpp
#include "OpeningScene.h" USING_NS_CC; Opening::~Opening() { } CCScene* Opening::scene() { // 'scene' is an autorelease object CCScene *scene = CCScene::create(); // 'layer' is an autorelease object Opening *layer = Opening::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene; } // on "init" you need to initialize your instance bool Opening::init() { ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } createGameScene(); this->setTouchEnabled(true); return true; }
HelloWorldScene에 비해 따로 특징적인 부분은 없습니다. init() 부분에서 createGameScene()으로 기본 정보를 초기화하고 setTouchEnabled(true)로 터치입력을 가능하게 해줍니다.
/Classes/OpeningScene.cpp
void Opening::createGameScene(void) { _screenSize = CCDirector::sharedDirector()->getWinSize(); CCSprite* openingImage = CCSprite::create("startbg.png"); openingImage->setPosition(ccp(_screenSize.width * 0.5f, _screenSize.height * 0.5f)); this->addChild(openingImage); }
초기화면으로 사용할 이미지를 생성하고요. 화면 중앙에 잘 배치해줍니다. 초기화면에는 아래의 이미지를 사용하도록 하겠습니다. 프로젝트에 잘 추가해주도록 합니다.
/Classes/OpeningScene.cpp
void Opening::changeScene(void) { CCScene* pScene = HelloWorld::scene(); CCTransitionScene* pTran = CCTransitionFade::create(1.0f, pScene); CCDirector::sharedDirector()->replaceScene(pTran); } void Opening::ccTouchesBegan(CCSet* pTouches, CCEvent* event) { changeScene(); }
화면을 터치하는 순간 changeScene()을 통해서 Game Scene으로 전환하려고 하는데요. changeScene() 함수 내용을 보면, 지금까지 게임을 구현했던 HelloWorld 클래스에 대한 scene()을 만들고, sharedDirector()->replaceScene(pTran)으로 화면을 전환하게 됩니다. replaceScene()에 전달되는 pTran 값을 보면 CCTransitionFade 라는 클래스를 사용하게 되는데요. Scene이 서로 점점 교차되면서 전환되는 효과를 보여줄 수 있습니다. 여기서는 1초 동안 현재 화면에서 HelloWorld화면으로 전환하는 것을 의미합니다.
화면 전환 효과는 굉장히 다양하게 줄 수 있는데요. 여기서 사용한 Fade효과 외에도 Zoom, Move, Flip 등 이름만 들어도 대충 이해할 수 있는 다양한 효과들을 제공하고 있습니다. cocos2d-x 사이트에도 간략하게 정보를 제공하고 있고요. youtube 등에서도 실제 전환하는 영상을 찾아볼 수 있습니다.
http://www.cocos2d-x.org/wiki/Transitions
초기화면까지 모두 만들었습니다. 빌드는 문제없이 잘되는 것 같은데, 처음 화면은 그대로 게임화면이 나오네요. 어플 실행 시 초기화면부터 나오도록 변경해야겠습니다. AppDelegate.cpp 에서 간단하게 바꿀 수 있습니다.
/Classes/AppDelegate.cpp
#include "AppDelegate.h" #include "HelloWorldScene.h" #include "OpeningScene.h" USING_NS_CC; AppDelegate::AppDelegate() { } AppDelegate::~AppDelegate() { } bool AppDelegate::applicationDidFinishLaunching() { // initialize director CCDirector* pDirector = CCDirector::sharedDirector(); CCEGLView* pEGLView = CCEGLView::sharedOpenGLView(); pDirector->setOpenGLView(pEGLView); CCEGLView::sharedOpenGLView()->setDesignResolutionSize(768, 1280, kResolutionExactFit); // turn on display FPS pDirector->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this pDirector->setAnimationInterval(1.0 / 60); // create a scene. it's an autorelease object // CCScene *pScene = HelloWorld::scene(); CCScene *pScene = Opening::scene(); // run pDirector->runWithScene(pScene); return true; }
조금 전에 만들었던 OpeningScene.h 헤더파일을 추가하고요. 초기 Scene으로 되어있던 HelloWorld::scene() 대신 Opening::scene()을 추가해줍니다. 이전 HelloWorld::scene() 라인은 주석처리 또는 삭제해서 실행되지 않게 해주시면 될 것 같습니다.
빌드를 하고 실행하면 초기화면부터 잘 뜨는군요! 터치를 하면 게임화면으로 스윽~ 넘어가게 됩니다.
다음에는 "시간제한"을 추가하여, 게임 중에 시간이 모두 지나면 다시 초기화면으로 돌아가게 만들어보겠습니다.
읽어주셔서 감사합니다!! 끝.
'cocos2d-x > pyocopang' 카테고리의 다른 글
cocos2d-x 포코팡 류 게임만들기!! - 14 - 시간 제한 (9) | 2014.07.28 |
---|---|
cocos2d-x 포코팡 류 게임만들기!! - 12 - 점수 계산 (0) | 2014.07.12 |
[버그] 첫 번째 코인이 선택되지 않는 문제 - 해결!! (0) | 2014.07.11 |
cocos2d-x 포코팡 류 게임만들기!! - 11 - 새로운 코인 생성 (2) | 2014.07.08 |
cocos2d-x 포코팡 류 게임만들기!! - 10 - 코인 애니메이션 (0) | 2014.07.07 |