Cocos2d-x 在屏幕上渲染菜单并添加消息响应

转自:http://blog.csdn.net/zhy_cheng/article/details/8270508

上一讲介绍了渲染文字,这次介绍在屏幕上渲染菜单,还是先看看我做出的效果吧:

这个效果还不错吧。图片都是解压《捕鱼达人》,然后自己ps得到的。

首先将屏幕大小设置为480x320

  1. eglView->setFrameSize(480, 320);//设置界面大小
eglView->setFrameSize(480, 320);//设置界面大小


  1. CCSprite *spritebg=CCSprite::create("bg.jpg"); //通过图片创建精灵
  2. CCSize size=CCDirector::sharedDirector()->getWinSize();//获取屏幕大小
  3. spritebg->setPosition(ccp(size.width/2,size.height/2));//将精灵的锚点设为屏幕的中间
  4. addChild(spritebg,0); //将精灵添加到最底层,作为背景
		CCSprite *spritebg=CCSprite::create("bg.jpg");   //通过图片创建精灵
		CCSize size=CCDirector::sharedDirector()->getWinSize();//获取屏幕大小

		spritebg->setPosition(ccp(size.width/2,size.height/2));//将精灵的锚点设为屏幕的中间
		addChild(spritebg,0);         //将精灵添加到最底层,作为背景


背景图片通过精灵来实现,效果如下

接着添加添加标题,和背景一样,不过要注意,添加在背景的上面

  1. CCSprite *spritetile=CCSprite::create("tile.png");
  2. CCSize s=spritetile->getContentSize();
  3. spritetile->setPosition(ccp(size.width/2,size.height-s.height/2));
  4. addChild(spritetile,1);//添加到第二层
		CCSprite *spritetile=CCSprite::create("tile.png");
		CCSize s=spritetile->getContentSize();
		spritetile->setPosition(ccp(size.width/2,size.height-s.height/2));
		addChild(spritetile,1);//添加到第二层


效果如下:

接下来

  1. CCMenuItemImage *start=CCMenuItemImage::create("start1.png",//正常状态的图片
  2. "start2.png",//按下去时的图片
  3. this,
  4. menu_selector(HelloWorld::startGame));
  5. //当这个菜单项被按下的时候的回调函数,
  6. //该函数设置为这个类的成员函数,返回值为void
  7. //参数为CCObject*
  8. CCSize startSize=start->getContentSize();//获取该菜单项的大小
  9. CCMenuItemImage *select=CCMenuItemImage::create("select1.png",
  10. "select2.png",
  11. this,//回调函数所在的类 menu_selector(HelloWorld::selectGame));
  12. CCSize selectSize=select->getContentSize();
  13. start->setPosition(ccp(0,(size.height-s.height)/2));
  14. //设置该菜单项在菜单中的位置,
  15. //若不设置,则该菜单项的锚点与菜单的锚点相同
  16. select->setPosition(ccp(0,((size.height-s.height)/2-startSize.height/2)/2));
  17. CCMenu *menu=CCMenu::create(start,select,NULL);//创建菜单,并将两个菜单项传入
  18. menu->setPosition(ccp(size.width/2,0));//设置菜单的位置,若不设置则为屏幕的正中间
  19. addChild(menu,1);
CCMenuItemImage *start=CCMenuItemImage::create("start1.png",//正常状态的图片
			"start2.png",//按下去时的图片
			this,
			menu_selector(HelloWorld::startGame));
		//当这个菜单项被按下的时候的回调函数,
		//该函数设置为这个类的成员函数,返回值为void
		//参数为CCObject*
		CCSize startSize=start->getContentSize();//获取该菜单项的大小

		CCMenuItemImage *select=CCMenuItemImage::create("select1.png",
			"select2.png",
			this,//回调函数所在的类                                                    			menu_selector(HelloWorld::selectGame));

		CCSize selectSize=select->getContentSize();
		start->setPosition(ccp(0,(size.height-s.height)/2));
		//设置该菜单项在菜单中的位置,
		//若不设置,则该菜单项的锚点与菜单的锚点相同

		select->setPosition(ccp(0,((size.height-s.height)/2-startSize.height/2)/2));

		CCMenu *menu=CCMenu::create(start,select,NULL);//创建菜单,并将两个菜单项传入
		

		menu->setPosition(ccp(size.width/2,0));//设置菜单的位置,若不设置则为屏幕的正中间
		addChild(menu,1);



这里创建两个菜单项,并加入到菜单中。回调函数先在头文件中声明,在源文件中实现

  1. void HelloWorld::startGame(CCObject* pSender)
  2. {
  3. CCLog("startGame");
  4. }
void HelloWorld::startGame(CCObject* pSender)
{
	CCLog("startGame");
}


CCLog();在输出打印字符串。现在的效果如下:

然后左边的两个也一样,这里就不多说了,最后把代码贴上来。

下面要说的是CCMenuToggle菜单,这个菜单点一下编成另外一个菜单

  1. CCMenuItemFont *oon=CCMenuItemFont::create("on",this,menu_selector(HelloWorld::oonGame));
  2. //新建一个文字菜单
  3. CCMenuItemFont *ooff=CCMenuItemFont::create("off",this,menu_selector(HelloWorld::ooffGame));
  4. //再来一个
  5. CCMenuItemToggle *toggle=CCMenuItemToggle::itemWithTarget(this,//回调函数所在的类
  6. menu_selector(HelloWorld::toggleGame),//回调函数
  7. oon,ooff,NULL //添加的菜单
  8. );
  9. toggle->setPosition(ccp(50,0));
  10. CCMenuItemFont *Go=CCMenuItemFont::create("GO",this,menu_selector(HelloWorld::LetsGo));//这种菜单就不说了
  11. Go->setPosition(ccp(70,80));
  12. CCMenu *lastMenu=CCMenu::create(toggle,Go,NULL);
  13. lastMenu->setPosition(ccp(50,50));
  14. addChild(lastMenu,2);
		CCMenuItemFont *oon=CCMenuItemFont::create("on",this,menu_selector(HelloWorld::oonGame));
		//新建一个文字菜单
		CCMenuItemFont *ooff=CCMenuItemFont::create("off",this,menu_selector(HelloWorld::ooffGame));
		//再来一个
		CCMenuItemToggle *toggle=CCMenuItemToggle::itemWithTarget(this,//回调函数所在的类
			menu_selector(HelloWorld::toggleGame),//回调函数
			oon,ooff,NULL    //添加的菜单
			);
		toggle->setPosition(ccp(50,0));

		CCMenuItemFont *Go=CCMenuItemFont::create("GO",this,menu_selector(HelloWorld::LetsGo));//这种菜单就不说了
		Go->setPosition(ccp(70,80));

		CCMenu *lastMenu=CCMenu::create(toggle,Go,NULL);
		lastMenu->setPosition(ccp(50,50));
		addChild(lastMenu,2);

这时候显示的是“on”

这时候显示的是“off”

注意:点击CCMenuItemToggle的时候,回调的函数是CCMenuItemToggle的回调函数。

最后当然是贴出代码,下面是init中的全部代码:

  1. bool HelloWorld::init()
  2. {
  3. bool bRet = false;
  4. do
  5. {
  6. CC_BREAK_IF(! CCLayer::init());
  7. CCSprite *spritebg=CCSprite::create("bg.jpg"); //通过图片创建精灵
  8. CCSize size=CCDirector::sharedDirector()->getWinSize();//获取屏幕大小
  9. spritebg->setPosition(ccp(size.width/2,size.height/2));//将精灵的锚点设为屏幕的中间
  10. addChild(spritebg,0); //将精灵添加到最底层,作为背景
  11. CCSprite *spritetile=CCSprite::create("tile.png");
  12. CCSize s=spritetile->getContentSize();
  13. spritetile->setPosition(ccp(size.width/2,size.height-s.height/2));
  14. addChild(spritetile,1);
  15. CCMenuItemImage *start=CCMenuItemImage::create("start1.png",//正常状态的图片
  16. "start2.png",//按下去时的图片
  17. this,//回调函数所在的类
  18. menu_selector(HelloWorld::startGame));
  19. //当这个菜单项被按下的时候的回调函数,
  20. //该函数设置为这个类的成员函数,返回值为void
  21. //参数为CCObject*
  22. CCSize startSize=start->getContentSize();//获取该菜单项的大小
  23. CCMenuItemImage *select=CCMenuItemImage::create("select1.png",
  24. "select2.png",
  25. this,
  26. menu_selector(HelloWorld::selectGame));
  27. CCSize selectSize=select->getContentSize();
  28. start->setPosition(ccp(0,(size.height-s.height)/2));
  29. //设置该菜单项在菜单中的位置,
  30. //若不设置,则该菜单项的锚点与菜单的锚点相同
  31. select->setPosition(ccp(0,((size.height-s.height)/2-startSize.height/2)/2));
  32. CCMenu *menu=CCMenu::create(start,select,NULL);//创建菜单,并将两个菜单项传入
  33. menu->setPosition(ccp(size.width/2,0));//设置菜单的位置,若不设置则为屏幕的正中间
  34. addChild(menu,1);
  35. CCMenuItemImage *question=CCMenuItemImage::create("wh1.png","wh2.png",
  36. this,menu_selector(HelloWorld::questionGame));
  37. CCSize qSize=question->getContentSize();
  38. question->setPosition(ccp(0,qSize.height+20));
  39. CCMenuItemImage *settings=CCMenuItemImage::create("sz1.png","sz2.png",
  40. this,menu_selector(HelloWorld::settingGame));
  41. CCMenu *m=CCMenu::create(question,settings,NULL);
  42. m->setPosition(ccp(qSize.width,qSize.height));
  43. addChild(m,1);
  44. CCMenuItemFont *oon=CCMenuItemFont::create("on",this,menu_selector(HelloWorld::oonGame));
  45. //新建一个文字菜单
  46. CCMenuItemFont *ooff=CCMenuItemFont::create("off",this,menu_selector(HelloWorld::ooffGame));
  47. //再来一个
  48. CCMenuItemToggle *toggle=CCMenuItemToggle::itemWithTarget(this,//回调函数所在的类
  49. menu_selector(HelloWorld::toggleGame),//回调函数
  50. oon,ooff,NULL //添加的菜单
  51. );
  52. toggle->setPosition(ccp(50,0));
  53. CCMenuItemFont *Go=CCMenuItemFont::create("GO",this,menu_selector(HelloWorld::LetsGo));
  54. Go->setPosition(ccp(70,80));
  55. CCMenu *lastMenu=CCMenu::create(toggle,Go,NULL);
  56. lastMenu->setPosition(ccp(50,50));
  57. addChild(lastMenu,2);
  58. bRet = true;
  59. } while (0);
  60. return bRet;
  61. }
bool HelloWorld::init()
{
    bool bRet = false;
    do 
    {

        CC_BREAK_IF(! CCLayer::init());

        
		CCSprite *spritebg=CCSprite::create("bg.jpg");   //通过图片创建精灵
		CCSize size=CCDirector::sharedDirector()->getWinSize();//获取屏幕大小

		spritebg->setPosition(ccp(size.width/2,size.height/2));//将精灵的锚点设为屏幕的中间
		addChild(spritebg,0);         //将精灵添加到最底层,作为背景

		
		CCSprite *spritetile=CCSprite::create("tile.png");
		CCSize s=spritetile->getContentSize();
		spritetile->setPosition(ccp(size.width/2,size.height-s.height/2));
		addChild(spritetile,1);

		

		CCMenuItemImage *start=CCMenuItemImage::create("start1.png",//正常状态的图片
			"start2.png",//按下去时的图片
			this,//回调函数所在的类

			menu_selector(HelloWorld::startGame));
		//当这个菜单项被按下的时候的回调函数,
		//该函数设置为这个类的成员函数,返回值为void
		//参数为CCObject*
		CCSize startSize=start->getContentSize();//获取该菜单项的大小

		CCMenuItemImage *select=CCMenuItemImage::create("select1.png",
			"select2.png",
			this,
			menu_selector(HelloWorld::selectGame));

		CCSize selectSize=select->getContentSize();
		start->setPosition(ccp(0,(size.height-s.height)/2));
		//设置该菜单项在菜单中的位置,
		//若不设置,则该菜单项的锚点与菜单的锚点相同

		select->setPosition(ccp(0,((size.height-s.height)/2-startSize.height/2)/2));

		CCMenu *menu=CCMenu::create(start,select,NULL);//创建菜单,并将两个菜单项传入
		

		menu->setPosition(ccp(size.width/2,0));//设置菜单的位置,若不设置则为屏幕的正中间
		addChild(menu,1);

		
		
		CCMenuItemImage *question=CCMenuItemImage::create("wh1.png","wh2.png",
			this,menu_selector(HelloWorld::questionGame));
		CCSize qSize=question->getContentSize();
		question->setPosition(ccp(0,qSize.height+20));
		CCMenuItemImage *settings=CCMenuItemImage::create("sz1.png","sz2.png",
			this,menu_selector(HelloWorld::settingGame));

		CCMenu *m=CCMenu::create(question,settings,NULL);
		
		m->setPosition(ccp(qSize.width,qSize.height));
		addChild(m,1);




		CCMenuItemFont *oon=CCMenuItemFont::create("on",this,menu_selector(HelloWorld::oonGame));
		//新建一个文字菜单
		CCMenuItemFont *ooff=CCMenuItemFont::create("off",this,menu_selector(HelloWorld::ooffGame));
		//再来一个
		CCMenuItemToggle *toggle=CCMenuItemToggle::itemWithTarget(this,//回调函数所在的类
			menu_selector(HelloWorld::toggleGame),//回调函数
			oon,ooff,NULL    //添加的菜单
			);
		toggle->setPosition(ccp(50,0));

		CCMenuItemFont *Go=CCMenuItemFont::create("GO",this,menu_selector(HelloWorld::LetsGo));
		Go->setPosition(ccp(70,80));

		CCMenu *lastMenu=CCMenu::create(toggle,Go,NULL);
		lastMenu->setPosition(ccp(50,50));
		addChild(lastMenu,2);



        bRet = true;
    } while (0);

    return bRet;
}


下面是所有的回调函数:

  1. void HelloWorld::startGame(CCObject* pSender)
  2. {
  3. CCLog("startGame");
  4. }
  5. void HelloWorld::selectGame(CCObject* pSender)
  6. {
  7. CCLog("selectGame");
  8. }
  9. void HelloWorld::settingGame(CCObject* pSender)
  10. {
  11. CCLog("settingGame");
  12. }
  13. void HelloWorld::questionGame(CCObject* pSender)
  14. {
  15. CCLog("questionGame");
  16. }
  17. void HelloWorld::oonGame(CCObject* pSender)
  18. {
  19. CCLog("oonGame");
  20. }
  21. void HelloWorld::ooffGame(CCObject* pSender)
  22. {
  23. CCLog("ooffGame");
  24. }
  25. void HelloWorld::toggleGame(CCObject* pSender)
  26. {
  27. CCLog("toggleGame");
  28. }
  29. void HelloWorld::LetsGo(CCObject* pSender)
  30. {
  31. CCLog("LetsGo");
  32. }
void HelloWorld::startGame(CCObject* pSender)
{
	CCLog("startGame");
}

void HelloWorld::selectGame(CCObject* pSender)
{
	CCLog("selectGame");
}

void HelloWorld::settingGame(CCObject* pSender)
{
	CCLog("settingGame");
}

void HelloWorld::questionGame(CCObject* pSender)
{
	CCLog("questionGame");
}


void HelloWorld::oonGame(CCObject* pSender)
{
	CCLog("oonGame");
}

void HelloWorld::ooffGame(CCObject* pSender)
{
	CCLog("ooffGame");

}

void HelloWorld::toggleGame(CCObject* pSender)
{
	CCLog("toggleGame");
}

void HelloWorld::LetsGo(CCObject* pSender)
{
	CCLog("LetsGo");
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值