欢迎光临Software MyZone,有问题可留言或到站点论坛发帖,争取第一时间帮忙解决 || 站点论坛:火龙论坛 || 淘宝小店:应小心的易淘屋 【欢迎大家提建设性意见】

简单的模态对话框ModalDialog

本文为firedragonpzy原创,转载务必在明显处注明:
转载自【Softeware MyZone】原文链接:
http://www.firedragonpzy.com.cn/index.php/archives/4374

欢迎热爱编程的朋友们参与到cocos2d-x编程中,为了给大家提供良好的交流环境,网站以开启QQ群
Software MyZone:66202765(群号,欢迎加入,若满,请加1群)
Software MyZone 1群(2dx):286504621
【加群请写:Software MyZone或者是firedragonpzy】
淘宝店:【应小心的易淘屋】初次开店,大家多多支持……
群论坛:火龙论坛正试运营阶段,欢迎大家多提些建设性意见……

简单封了一个模态对话框和大家分享。

使用注意事项:

  • 注意设置contentSize,这个是不屏蔽点击的区域,以屏幕中心点为中心,辐射contentsize大小的区域
  • m_pModelType 为弹框类型,以便自己在扩展
  • 为了避免多次弹窗,最好在调用弹窗的类中增加弹窗类属性,以避免多次弹窗

避免多次弹窗使用实例如下:

void CMainMenuScene::__addModalDialog( EModalType modalType /* = LEVEL_LOADING*/, CCPoint pos /* = CCPointZero*/)
{
	m_pModalDialog = CModalDialog::create(modalType);
	m_pModalDialog->setPosition(pos);
	this->addChild(m_pModalDialog, ZORDER_MODAL_DIALOG);
}

void CMainMenuScene::__removeMoadalDialog()
{
	m_pModalDialog->removeFromParentAndCleanup(true);
	m_pModalDialog = NULL;
}

ModalDialog.h

//
//	ModalDialog.h
//
//	WeArePests
//
//	Created by firedragonpzy o 2014-06-09
//
//

#ifndef __WEAREPESTS__MODALDIALOG__
#define __WEAREPESTS__MODALDIALOG__

#include "cocos2d.h"
#include "UtilTools\RConfig.h"
#include "UtilTools\VisibleRect.h"

USING_NS_CC;

enum EModalType
{
	LEVEL_LOADING	//	关卡loading
};

//********************************************************************************************************
//Copyright © 2014  firedragonpzy 
//
//作  者:firedragonpzy
//日 期:2014/06/09 15:21:14
//描 述:模态窗口,如果有背景图片,设置层的大小为背景图大小,否则为CCSizeZero
//版 本:1.00
//修改历史记录
//版 本     修改时间      修改人     变更内容
//1.00       2014/06/09 15:21:14   firedragonpzy        新增
//********************************************************************************************************
class CModalDialog : public CCLayer
{
public:
	virtual bool init();
	void onEnter();
	void onExit();
	virtual void registerWithTouchDispatcher(void);
	static CModalDialog* create(EModalType modalType = LEVEL_LOADING);
	bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
protected:

	CModalDialog( EModalType modalType );
	~CModalDialog();

private:
	//	弹窗类型
	EModalType m_pModelType;

	void __initParams();
	void __initResources();

	//	是不是在弹框大小的区域内
	bool __isContaintLocation(CCPoint pos);
	//	得到弹窗的区域
	CCRect __getAtalsRect();
};


#endif

ModalDialog.cpp

#include "View\ModalDialog.h"

enum ZORDER
{
	ZORDER_BG = -1,
};

CModalDialog::CModalDialog( EModalType modalType )
{
	m_pModelType = modalType;
}

CModalDialog::~CModalDialog()
{

}

CModalDialog* CModalDialog::create( EModalType modalType /*= LEVEL_LOADING */)
{
	CModalDialog *dialog = new CModalDialog(modalType);

	if (dialog && dialog->init())
	{
		dialog->autorelease();
		return dialog;
	}

	dialog->release();
	dialog = NULL;
	return dialog;

}

bool CModalDialog::init()
{
	bool bRet = false;

	do
	{
		__initParams();
		CC_BREAK_IF(!CCLayer::init());
		bRet = true;
	} while (0);

	return bRet;
}

void CModalDialog::registerWithTouchDispatcher()
{
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, -128, true);
}

void CModalDialog::__initParams()
{
	setContentSize(CCSizeZero);
}

void CModalDialog::onEnter()
{
	CCLayer::onEnter();
	setTouchEnabled(true);
	__initResources();
}

void CModalDialog::onExit()
{
	CCLayer::onExit();
	CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}

void CModalDialog::__initResources()
{
	CCSprite *bg = NULL;
	switch (m_pModelType)
	{
	case LEVEL_LOADING:
		bg = CCSprite::create(GAME_LOADING_BG);
		bg->setPosition(ccp(VisibleRect::getVisibleRect().size.width/2, VisibleRect::getVisibleRect().size.height/2));
		this->addChild(bg,ZORDER_BG);
		setContentSize(bg->getContentSize());
		break;
	default:
		break;
	}
}

bool CModalDialog::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
	if (!__isContaintLocation(pTouch->getLocation()))
	{
		return true;
	}
	return false;
}

bool CModalDialog::__isContaintLocation(CCPoint pos)
{
	return __getAtalsRect().containsPoint(pos);
}

CCRect CModalDialog::__getAtalsRect()
{
	CCSize cSize = getContentSize();
	return CCRectMake(VisibleRect::getVisibleRect().size.width/2 - cSize.width/2 ,VisibleRect::getVisibleRect().size.height/2 - cSize.height/2, cSize.width,cSize.height);
}