원글 출처 : http://horns.tistory.com/18
-13- 화면 전환
1. 초기 화면 구성
Classes에서 우클릭, New->Header File로 OpeningScene.h를 추가합니다.
OpeningScene.h
#ifndef OPENINGSCENE_H_ #define OPENINGSCENE_H_ #include "cocos2d.h" #include "HelloWorldScene.h" using namespace cocos2d; class Opening: public cocos2d::Layer { private: Size _screenSize; public: virtual bool init(); static cocos2d::Scene* scene(); CREATE_FUNC(Opening); EventListenerTouchOneByOne * listener; void creatGameScene(void); void changeScene(void); virtual bool onTouchBegan(Touch* touch, Event* event); }; #endif /* OPENINGSCENE_H_ */
마찬가지로 이번엔 OpeningScene.cpp를 추가합니다.
OpeningScene.cpp
#include "OpeningScene.h" #include "HelloWorldScene.h" USING_NS_CC; Scene* Opening::scene() { Scene *scene = Scene::create(); Opening *layer = Opening::create(); scene->addChild(layer); return scene; } bool Opening::init() { if (!Layer::init()) { return false; } creatGameScene(); this->setTouchEnabled(true); EventDispatcher* dispatcher = Director::getInstance()->getEventDispatcher(); listener = EventListenerTouchOneByOne::create(); listener->setSwallowTouches(true); listener->onTouchBegan = CC_CALLBACK_2(Opening::onTouchBegan, this); dispatcher->addEventListenerWithSceneGraphPriority(listener, this); return true; }
void Opening::creatGameScene(void) { _screenSize = Director::sharedDirector()->getWinSize(); Sprite* openingImage = Sprite::create("startbg.png"); openingImage->setPosition(ccp(_screenSize.width * 0.5f, _screenSize.height * 0.5f)); this->addChild(openingImage); }
void Opening::changeScene(void) { // Director::getInstance()->getEventDispatcher()->removeAllEventListeners(); Director::getInstance()->getEventDispatcher()->removeEventListenersForType(EventListener::Type::TOUCH_ONE_BY_ONE); auto hScene = HelloWorld::createScene(); auto pScene = TransitionFade::create(1.0f, hScene); Director::getInstance()->replaceScene(pScene); } bool Opening::onTouchBegan(Touch* touch, Event* event) { auto target = event->getCurrentTarget(); Point location = target->convertToNodeSpace(touch->getLocation()); changeScene(); return true; }
다음을 참고해주세요.
1. 원출처 이미지가 jpg로 되어있으므로, 소스에서 png대신 jpg로 쓰시거나, 이미지 자체를 png로 변경하셔서 사용하세요.
2. 3.0버전부터 터치가 리스너에 들어가있기 때문에, 씬 전환때 자원 해제를 해주지 않으면 전환 후 씬에서 터치가 제대로 동작하지 않게 됩니다. 이에 관해서는 onEnter(), onExit() 등의 메서드를 오버라이드 해서 사용하는 방법이 일반적인데, 저는 그냥 씬 전환 직전에 이벤트 리스너를 해제해주는 방법을 사용했습니다. 내용은 다음 출처를 확인해주세요.
ReplaceScene과 EventListner에 관하여 : http://blog.naver.com/jidon333/220069600001
결과적으로 제가 한참 헤맸던 부분은 제가 소스를 잘못 쓰는 바람에 문제가 생겼던 걸로, 아마 onEnter(), onExit() 방식을 다시 적용해도 제대로 동작할거라고 생각합니다. 그 부분은 강좌를 끝내고 커스텀 할 때 테스트 해보도록 할게요.
참고로, 씬 전환 사이에 호출되는 메서드 순서 관련 : http://zzaps.tistory.com/213 / http://akichim.hatenablog.jp/entry/2013/12/08/154641
3. Transition은 씬 전환하는데 여러가지 효과를 줍니다. 밑에 쭉 사용 가능한 것들과 몇개는 주석을 달아놨는데 움직이는건 직접 써보시는게 좋을 거 같아요. 은근 재미있습니다.
Transition 관련 참고 링크 : http://singleton.tistory.com/366
void Opening::changeScene(void) { // Director::getInstance()->getEventDispatcher()->removeAllEventListeners(); Director::getInstance()->getEventDispatcher()->removeEventListenersForType(EventListener::Type::TOUCH_ONE_BY_ONE); auto hScene = HelloWorld::createScene(); auto pScene = TransitionFade::create(1.0f, hScene); // TransitionCrossFade::create(1.0f, HelloWorld::createScene()); // TransitionRotoZoom::create(0.5f, hScene); // TransitionFade::create(0.5f,hScene,Color3B::GREEN); // TransitionFadeBL::create(0.5f,hScene); // TransitionFadeDown::create(0.5f,hScene); // TransitionFadeTR::create(0.5f,hScene); // TransitionFadeUp::create(0.5f, hScene); // TransitionFlipAngular::create(0.5f, hScene, TransitionScene::Orientation::LEFT_OVER); // TransitionFlipX::create(0.5f, hScene, TransitionScene::Orientation::DOWN_OVER); // TransitionFlipY::create(0.5f, hScene, TransitionScene::Orientation::UP_OVER); // TransitionJumpZoom::create(3.0f, hScene); //시간이 충분히 커야 효과를 제대로 볼 수 있음. // TransitionMoveInB::create(0.5f, hScene); // TransitionMoveInL::create(0.5f, hScene); // TransitionMoveInR::create(0.5f, hScene); // TransitionMoveInT::create(0.5f, hScene); // TransitionPageTurn::create(0.5f, hScene, false); // TransitionProgress::create(0.5f, hScene); //앱이 죽어버립니다. // TransitionProgressHorizontal::create(0.5f, hScene); // TransitionProgressInOut::create(0.5f, hScene); // TransitionProgressOutIn::create(0.5f, hScene); // TransitionProgressRadialCCW::create(0.5f, hScene); // TransitionProgressRadialCW::create(0.5f, hScene; // TransitionProgressVertical::create(0.5f, hScene); // TransitionRotoZoom::create(2.0f, hScene); //시간이 너무 짧으면 제대로 안보임 // TransitionScene::create(0.5f, hScene); //전환된 씬에서 터치가 동작하지 않음. // TransitionSceneOriented::create(0.5f, hScene, TransitionScene::Orientation::RIGHT_OVER); //전환된 씬에서 터치 동작x // TransitionShrinkGrow::create(0.5f, hScene); // TransitionSlideInB::create(0.5f, hScene); // TransitionSlideInL::create(0.5f, hScene); // TransitionSlideInR::create(0.5f, hScene); // TransitionSlideInT::create(0.5f, hScene); // TransitionSplitCols::create(1.5f, hScene); // TransitionSplitRows::create(1.5f, hScene); // TransitionTurnOffTiles::create(0.5f, hScene); // TransitionZoomFlipAngular::create(0.5f, hScene, TransitionScene::Orientation::DOWN_OVER); // TransitionZoomFlipX::create(0.5f, hScene, TransitionScene::Orientation::LEFT_OVER); // TransitionZoomFlipY::create(0.5f, hScene, TransitionScene::Orientation::RIGHT_OVER); Director::getInstance()->replaceScene(pScene); }
AppDelegate.cpp
초기 실행화면을 교체합니다.
#include "AppDelegate.h" #include "HelloWorldScene.h" #include "OpeningScene.h" USING_NS_CC; AppDelegate::AppDelegate() { } AppDelegate::~AppDelegate() { } bool AppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance(); auto glview = director->getOpenGLView(); if(!glview) { glview = GLView::create("My Game"); director->setOpenGLView(glview); } // turn on display FPS director->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this director->setAnimationInterval(1.0 / 60); // create a scene. it's an autorelease object // auto scene = HelloWorld::createScene(); auto scene = Opening::scene(); // run director->runWithScene(scene); return true; }
실행 화면 :