cocos2d-x 공부용2014. 9. 17. 14:06

원글 출처 : 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/213http://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;
}


실행 화면 : 


 




Posted by 아이시네프