adsense



[cocos2d-x] 심플&범용 팝업 클래스

첨부파일 : Popup_example.zip

헤더
#ifndef __POPUP_LAYER_H__
#define __POPUP_LAYER_H__

#include "cocos2d.h"

USING_NS_CC;

using namespace std;


class PopupLayer : public cocos2d::Layer
{
public:
static PopupLayer* create();

virtual bool init();


//콜백 등록/호출을 위한 함수
typedef std::function<void(int)> FUNC;//함수 형태를 정의합니다. 인수는 필요한 형태로 설정
FUNC _func;
void regi_func(FUNC pFunc);//팝업을 생성한 쪽에서 콜백을 등록합니다

void menuCB(int);
};

#endif // __POPUP_LAYER_H__



클래스
#pragma execution_character_set("utf-8")
#include "PopupLayer.h"
#include "ui\CocosGUI.h"


USING_NS_CC;
using namespace std;
using namespace ui;

PopupLayer* PopupLayer::create()
{
PopupLayer* layer = new PopupLayer();



if (layer->init())

{

return layer;

}



CC_SAFE_DELETE(layer);

return NULL;

}

// on "init" you need to initialize your instance
bool PopupLayer::init()
{
if ( !Layer::init() )
{
return false;
}

/*
1. 화면 구성
2. 버튼 설정 및 콜백 호출
3. 팝업 레이어가 아래로 내려가는 터치를 삼키는 처리
*/


auto visibleSize = Director::getInstance()->getVisibleSize();
auto origin = Director::getInstance()->getVisibleOrigin();

//1. 화면 구성
auto white = Sprite::create("white.png");
white->setPosition(visibleSize * 0.5f);
white->setColor(Color3B::BLACK);
white->setOpacity(128);
white->setScale(20);
addChild(white);

auto popbase = Scale9Sprite::create("popbase.png");

popbase->setCapInsets(Rect(19, 19, 90, 72));
popbase->setPosition(visibleSize * 0.5f);
popbase->setContentSize(Size(500, 700));
addChild(popbase);

//2.버튼용 콜백 설정
//콜백은 람다, 콜백객체, 콜백함수 등 여러가지로 만들어 적용할 수 있으니
//필요에 따라 적당한 서식으로 해 줍니다
auto callback = ([=](Ref* sender, Widget::TouchEventType type) {

Button* node = dynamic_cast<Button*>(sender);
switch (type)

{

case Widget::TouchEventType::BEGAN:

node->setColor(Color3B(128, 128, 128));

break;

case Widget::TouchEventType::MOVED:

break;

case Widget::TouchEventType::ENDED:

node->setColor(Color3B::WHITE);

//CCLOG("%d", node->getTag());

menuCB(node->getTag());

break;

case Widget::TouchEventType::CANCELED:

node->setColor(Color3B::WHITE);

break;

}

});


//OK버튼
auto okbutton = Button::create("buttonstart.png", "buttonstart.png", "buttonstart.png", Widget::TextureResType::LOCAL);
okbutton->setPosition(Vec2(visibleSize.width * 0.5f - 120, visibleSize.height - 800));
okbutton->setSwallowTouches(true);
okbutton->addTouchEventListener(callback);
okbutton->setTag(2);
okbutton->setTitleText("OK");
okbutton->setTitleFontSize(64);
okbutton->setScale(0.5f);
addChild(okbutton);

//NO버튼
auto backbutton = Button::create("buttonstart.png", "buttonstart.png", "buttonstart.png", Widget::TextureResType::LOCAL);
backbutton->setPosition(Vec2(visibleSize.width * 0.5f + 120, visibleSize.height - 800));
backbutton->setTag(3);
backbutton->setSwallowTouches(true);
backbutton->addTouchEventListener(callback);
backbutton->setTitleText("NO");
backbutton->setTitleFontSize(64);
backbutton->setScale(0.5f);
addChild(backbutton);


//3.레이어 전체에 터치리스너를 걸고,
//setSwallowTouches(true) 하여 아래로 내려가지 못하도록 막아줍니다
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = [=](Touch* touch, Event* event) {
return true;
};
listener->onTouchEnded = [=](Touch* touch, Event* event) {
log("swallowed by popup");
};
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);

return true;
}


void PopupLayer::menuCB(int tag)
{
switch (tag)
{
case 0:
break;
case 1:
break;
case 2:
_func(0);//팝업 호출시 등록된 콜백을 호출하여 선택된 값을 되돌려 줍니다.
removeFromParent();
break;
case 3:
_func(1);//팝업 호출시 등록된 콜백을 호출하여 선택된 값을 되돌려 줍니다.
removeFromParent();
break;
}
}
void PopupLayer::regi_func(FUNC pFunc)
{
//팝업 호출시 콜백함수를 등록합니다.
_func = std::move(pFunc);
}



사용방법
            //팝업레이어를 생성해 올립니다
auto popup = PopupLayer::create();

//팝업에서 호출할 콜백을 등록합니다
popup->regi_func([=](int ret) {
log("popup return %d", ret);
((Label*)getChildByName("LABEL"))->setString(StringUtils::format("POPUP returned %d", ret));
});

//붙이는 방법은 어느것이라도
Director::getInstance()->getRunningScene()->addChild(popup, 1);
//this->addChild(popup, 1);




실행예



덧글

댓글 입력 영역


Books

Geek라이프

게임 매니악스 슈팅 게임 알고리즘
마츠우라 켄이치로,츠카사 유키 공저/손정도 역/박민근,Pope Kim 감수

게임 매니악스 퍼즐 게임 알고리즘
마츠우라 켄이치로,츠카사 유키 공저/김병국 역

만들면서 배우는 유니티 게임 프로그래밍
송용성 저

핵심강좌! Cocos2d-x
이재환 저

될 수 있어! SE 10
나츠미 코지 저/Ixy 그림/김경훈 역
예스24 | 애드온2