[Cocos2d-x] モーダルレイヤを作成するを参考にして作ってみた。細かいところは未検証。とりあえず動くかなという状態。
FSAlertLayer.cpp
#include "FSAlertLayer.h" USING_NS_CC; // ceate with 2 buttons FSAlertLayer* FSAlertLayer::create(const char* message, CCObject *target, SEL_CallFuncN okSelector, SEL_CallFuncN ngSelector) { FSAlertLayer* layer = FSAlertLayer::create(); layer->setStyle(message, target, okSelector, ngSelector); return layer; } // create with only 1 button FSAlertLayer* FSAlertLayer::create(const char *message, cocos2d::CCObject *target, cocos2d::SEL_CallFuncN okSelector) { return FSAlertLayer::create(message, target, okSelector, NULL); } bool FSAlertLayer::init() { // half clear black bgcolor if (! CCLayerColor::initWithColor(ccc4(0, 0, 0, 100))) { return false; } CCDirector* pDirector = CCDirector::sharedDirector(); pDirector->getTouchDispatcher()->addTargetedDelegate(this, kCCMenuHandlerPriority, true); CCSize vsize = pDirector->getVisibleSize(); // bg CCSprite* frame = CCSprite::create("bg_alert.png"); frame->setTag(FSAlertLayerTagFrame); frame->setPosition(ccp(vsize.width / 2, vsize.height / 2)); this->addChild(frame); return true; } void FSAlertLayer::setStyle(const char* message, cocos2d::CCObject *target, cocos2d::SEL_CallFuncN okSelector, cocos2d::SEL_CallFuncN ngSelector) { this->target = target; this->okSelector = okSelector; this->ngSelector = ngSelector; CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); // message CCLabelTTF *pMsg = CCLabelTTF::create(message, "", 16); pMsg->setPosition(ccp(visibleSize.width / 2, visibleSize.height / 2)); this->addChild(pMsg); // OK Button CCMenuItemImage *pOKItem = CCMenuItemImage::create("btn_ok.png", "btn_ok.png", this, menu_selector(FSAlertLayer::menuAlertOK)); int btnHeight = visibleSize.height / 2 - this->getChildByTag(FSAlertLayerTagFrame)->getContentSize().height / 2 + pOKItem->getContentSize().height / 2 + 10; pOKItem->setTag(FSAlertLayerTagOK); pOKItem->setPosition(ccp(visibleSize.width / 2, btnHeight)); CCMenu* pMenu = CCMenu::create(pOKItem, NULL); pMenu->setPosition(CCPointZero); pMenu->setTag(FSAlertLayerTagMenu); this->addChild(pMenu); // set as 2 buttons if (ngSelector) { pOKItem->setPosition(ccp(visibleSize.width / 2 - pOKItem->getContentSize().width / 2, btnHeight)); // NG btn CCMenuItemImage* pNGItem = CCMenuItemImage::create("btn_back.png", "btn_back.png", this, menu_selector(FSAlertLayer::menuAlertClose)); pNGItem->setTag(FSAlertLayerTagNG); pNGItem->setPosition(ccp(visibleSize.width / 2 + pOKItem->getContentSize().width / 2, btnHeight)); pMenu->addChild(pNGItem); } } // touch event disable other layers bool FSAlertLayer::ccTouchBegan(CCTouch* touch, CCEvent* event) { return true; } void FSAlertLayer::menuAlertOK(CCObject* pSender) { CCLOG("OK"); this->menuAlertClose(pSender); if (this->target && this->okSelector) { (this->target->*this->okSelector)(this); } } void FSAlertLayer::menuAlertClose(cocos2d::CCObject *pSender) { this->removeFromParentAndCleanup(true); CCDirector* pDirector = CCDirector::sharedDirector(); pDirector->getTouchDispatcher()->removeDelegate(this); if (((CCNode*)pSender)->getTag() == FSAlertLayerTagNG && this->target && this->ngSelector) { (this->target->*this->ngSelector)(this); } }
FSAlertLayer.h
#ifndef __xxx__FSAlertLayer__ #define __xxx__FSAlertLayer__ #include "cocos2d.h" #define FSAlertLayerTagMenu 101 #define FSAlertLayerTagOK 102 #define FSAlertLayerTagNG 103 #define FSAlertLayerTagFrame 110 class FSAlertLayer : public cocos2d::CCLayerColor { public: static FSAlertLayer* create(const char* message, CCObject* target, cocos2d::SEL_CallFuncN okSelector, cocos2d::SEL_CallFuncN ngSelector); static FSAlertLayer* create(const char* message, CCObject* target, cocos2d::SEL_CallFuncN okSelector); virtual bool init(); void setStyle(const char* message, CCObject* target, cocos2d::SEL_CallFuncN okSelector, cocos2d::SEL_CallFuncN ngSelector); virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); void menuAlertOK(CCObject* pSender); void menuAlertClose(CCObject* pSender); CREATE_FUNC(FSAlertLayer); private: cocos2d::CCObject* target; cocos2d::SEL_CallFuncN okSelector; cocos2d::SEL_CallFuncN ngSelector; }; #endif /* defined(__xxx__FSAlertLayer__) */
利用側
// call from Scene, Layer, etc FSAlertLayer *alertLayer = FSAlertLayer::create("XXXを使用します。よろしいですか", this, callfuncN_selector(ThisScene::menuOKCallback), callfuncN_selector(ThisScene::menuNGCallback)); // 適当に高い数値を入れて最上部に表示させる this->addChild(alertLayer, 100001);