展会信息港展会大全

Cocos2d-x中实现弹出对话框示例
来源:互联网   发布日期:2015-09-28 10:40:20   浏览:1586次  

导读: 在游戏中我们经常会看到弹出一个对话框让我们进行选择,今天我们就在cocos2dx中实现这个对话框。对话框说白了也是一个层,当我们点击某一个按钮的时候这个层被加进了当前的场景中,同时场景中的其他的...

在游戏中我们经常会看到弹出一个对话框让我们进行选择,今天我们就在cocos2dx中实现这个对话框。对话框说白了也是一个层,当我们点击某一个按钮的时候这个层被加进了当前的场景中,同时场景中的其他的层都是不可点击的,这个时候就涉及到触摸的优先级的一些问题,当然有些时候你也可以根据自己的需要让其他的层也可以点击,但是道理都是一样的,学会了这个其他的按照自己的要求去实现吧。下面我将弹出层单独分装成一个类,供我们调用。

/*对话框场景类的头文件*/

#ifndef _POP_SCENE_H_

#define _POP_SCENE_H_

#include "cocos2d.h"

using namespace cocos2d;

class PopScene : public CCLayer

{

public:

static CCScene * scene();

bool init();

CREATE_FUNC(PopScene);

private:

//注册触摸事件,实现ccTouchBegan()方法

void registerWithTouchDispatcher();

bool ccTouchBegan(CCTouch * touch,CCEvent * pevent);

//在弹出的对话框上加俩个按钮,以下的函数是对应的按钮的处理事件

void yesButton(CCObject * object);

void noButton(CCObject * object);

//设置对话框的title

void setTitle();

//设置对话框的文本内容

void setContent();

//m_size代表的是对话框背景的大小

CCSize m_size;

//对话框的背景精灵

CCSprite * m_bgSprite;

};

#endif

/*对话框场景类的具体实现*/

#include "PopScene.h"

CCScene * PopScene::scene()

{

CCScene * scene = NULL;

do

{

scene = CCScene::create();

PopScene * layer = PopScene::create();

scene->addChild(layer);

}

while(0);

return scene;

}

bool PopScene::init()

{

bool bRet = false;

do

{

CC_BREAK_IF(!CCLayer::init());

CCSize winSize = CCDirector::sharedDirector()->getWinSize();

//设置这个层的背景图片,并且设置其位置为整个屏幕的中点

CCSprite * background = CCSprite::create("background.png");

m_bgSprite = background;

background->setPosition(ccp(winSize.width/2,winSize.height/2));

this->addChild(background);

//获得背景图片的大小

CCSize contentSize = background->getContentSize();

m_size = contentSize;

//添加俩个菜单在这个层中

CCMenuItemImage * item1 = CCMenuItemImage::create("btn-play-normal.png",

"btn-play-selected.png","",

this,menu_selector(PopScene::yesButton));

CCMenuItemImage * item2 = CCMenuItemImage::create("btn-highscores-normal.png",

"btn-highscores-selected.png","",

this,menu_selector(PopScene::noButton));

CCMenu * menu = CCMenu::create(item1,item2,NULL);

menu->alignItemsHorizontallyWithPadding(5);

menu->setPosition(ccp(contentSize.width/2,contentSize.height/3));

//kCCMenuHandlerPriority的值为-128,代表的是菜单按钮的触摸优先级

//设置menu优先级,这里设置为普通menu的二倍减一,原因看下边

menu->setTouchPriority(kCCMenuHandlerPriority*2-1);

background->addChild(menu);

//设置题目和文本内容

this->setTitle();

this->setContent();

this->setTouchEnabled(true);

bRet = true;

}

while(0);

return bRet;

}

void PopScene::registerWithTouchDispatcher()

{

//kCCMenuHandlerPriority=-128,将这个值设置为-128的二倍,可以比下边的层的优先级高

//而且ccTouchBegan的返回值为true,说明其他的层将接受不到这个触摸消息了,只有这个层上边的

//菜单的优先级比他还要打,所以它上边的菜单是可以接收到触摸消息的

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,

kCCMenuHandlerPriority*2,true);

}

bool PopScene::ccTouchBegan(CCTouch * touch,CCEvent * pevent)

{

return true;

}

//点击菜单按钮的时候调用的事件处理函数

void PopScene::yesButton(CCObject * object)

{

this->removeFromParentAndCleanup(true);

}

void PopScene::noButton(CCObject * object)

{

this->removeFromParentAndCleanup(true);

}

//设置这个层的题目

void PopScene::setTitle()

{

//CCLabelTTF * title = CCLabelTTF::create("Tips","",24);

CCLabelBMFont * title = CCLabelBMFont::create("Tips","bitmapFontChinese.fnt");

title->setPosition(ccp(m_size.width/2,m_size.height-title->getContentSize().height/2));

m_bgSprite->addChild(title);

}

//设置层的内容

void PopScene::setContent()

{

CCLabelTTF * content = CCLabelTTF::create("hello! everyone,welcome to www.jb51.net",

"",24);

content->setPosition(ccp(m_size.width/2,m_size.height/2));

//设置ttf的文本域

content->setDimensions(CCSize(this->m_size.width-60,this->m_size.height-100));

//设置ttf的水平对齐方式

content->setHorizontalAlignment(kCCTextAlignmentLeft);

m_bgSprite->addChild(content);

}

//helloworld中按钮的回调函数

void HelloWorld::menuCloseCallback(CCObject* pSender)

{

PopScene* popLayer = PopScene::create();

this->addChild(popLayer);

}

赞助本站

人工智能实验室
AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港