Cocos2d-x之Menu
| 版权声明:本文为博主原创文章,未经博主允许不得转载。
cocos2d-x菜单简介:
菜单也是游戏开发中的重要环节,一般游戏开始的第一个画面都是游戏主菜单,这些菜单包括,开始游戏,游戏设置,关卡设置等等;Menu是菜单项的容器,用来装载各种菜单项,cocos2d-x游戏引擎中的菜单是由菜单类Menu和菜单项MenuItem来实现的。首先定义菜单项,然后用它们定义初始化菜单Menu实例,最后将Menu实例加入Layer中显示出来,菜单类还提供了alignItemsVertically和align-ItemsHorizontally等函数。tests项目中MenuTest.cpp的MenuLayer2的构造函数alignMenusH就是alignItems-Horizontally水平对齐两种方法对比 一 种是alignItemsHorizontally水平对齐,底下是alignItemsHorizontallyWithPadding 留空间水平对齐,Menu是MenuItem的一个容器,里面可以添加若干个菜单项MenuItem,MenuItem又有若干个子类,来实现不同样式的菜单,例如,文本菜单,字体菜单,图片菜单等。菜单Menu,菜单项MenuItem及其子类的UML图.
1. MenuItemFont
MenuItemFont构成的菜单,这种菜单是最简单的一种菜单,只需要指定菜单项要显示的内容,字体和字号即可实现。
实例:
.h files #ifndef _MENUITEMFONTTEST_SCENE_H_
#define _MENUITEMFONTTEST_SCENE_H_
#include "cocos2d.h"
class menuItem : public cocos2d::Layer
{
private:
cocos2d::Size visible;
cocos2d::Vec2 origin;
public:
static cocos2d::Scene* createScene();
virtual bool init();
void Test();
void CallBack1(Ref* sendef);
void CallBack2(Ref* sendef);
void CallBack3(Ref* sendef);
CREATE_FUNC(menuItem);
};
#endif // _MENUITEMFONTTEST_SCENE_H_ .cpp files #include "MenuItemFontTest.h"
USING_NS_CC;
Scene* menuItem::createScene()
{
auto scene = Scene::create();
auto layer = menuItem::create();
scene->addChild(layer);
return scene;
}
bool menuItem::init()
{
if (!Layer::init())
{
return false;
}
visible = Director::getInstance()->getVisibleSize();
origin = Director::getInstance()->getVisibleOrigin();
this->Test();
return true;
}
void menuItem::Test()
{
//设置字体和大小
MenuItemFont::setFontName("Marker Felt.ttf");
MenuItemFont::setFontSize(24);
auto item1 = MenuItemFont::create("Start", CC_CALLBACK_1(menuItem::CallBack1, this));
auto item2 = MenuItemFont::create("Help", CC_CALLBACK_1(menuItem::CallBack2, this));
auto item3 = MenuItemFont::create("Exit", CC_CALLBACK_1(menuItem::CallBack3, this));
auto menu = Menu::create(item1, item2, item3, NULL);
menu->setPosition(Vec2(origin.x + visible.width / 2,
origin.y + visible.height - visible.height / 3));
menu->alignItemsVerticallyWithPadding(5);
this->addChild(menu);
}
void menuItem::CallBack1(Ref* sendef)
{
CCLOG("Start...");
}
void menuItem::CallBack2(Ref* sendef)
{
CCLOG("Help...");
}
void menuItem::CallBack3(Ref* sendef)
{
CCLOG("Exit...");
}
MenuItemFont的一些重要函数和功能
2. MenuItemImage
MenuItemImage顾名思义就是图片菜单项,图片菜单项在游戏中很常用,首先准备设计好的图片,图片样式可以分为默认图片、选中图片样式等。程序员将设计好的图片加载到项目中,并实现代码:
MenuItemImage的实例化方法如下:
static MenuItemImage* MenuItemImage::create(const std::string& normalImage,
const std::string& selectedImage, const ccMenuCallback& callback);
第一个参数是默认图片
第二个参数是选中图片
第三个参数是时间方法的目标对象
第四个参数是调用选择器
实例:
.h files #define _MENUITEMIMAGETEST_SCENE_H_
#include "cocos2d.h"
class ItemImage : public cocos2d::Layer
{
private:
cocos2d::Size visible;
cocos2d::Vec2 origin;
public:
static cocos2d::Scene* createScene();
virtual bool init();
void Test();
void CallBack1(cocos2d::Ref* sendef);
void CallBack2(cocos2d::Ref* sendef);
CREATE_FUNC(ItemImage);
};
#endif // _MENUITEMIMAGETEST_SCENE_H_ .cpp files #include "MenuItemImageTest.h"
USING_NS_CC;
Scene* ItemImage::createScene()
{
auto scene = Scene::create();
auto layer = ItemImage::create();
scene->addChild(layer);
return scene;
}
bool ItemImage::init()
{
if (!Layer::init())
{
return false;
}
visible = Director::getInstance()->getVisibleSize();
origin = Director::getInstance()->getVisibleOrigin();
this->Test();
return true;
}
void ItemImage::Test()
{
auto item1 = MenuItemImage::create("OK1.png",
"OK2.png",
CC_CALLBACK_1(ItemImage::CallBack1, this));
auto item2 = MenuItemImage::create("Buy1.png",
"Buy2.png",
CC_CALLBACK_1(ItemImage::CallBack2, this));
auto menu = Menu::create(item1, item2, NULL);
menu->setPosition(Vec2(origin.x + visible.width / 2,
origin.y + visible.height / 3));
menu->alignItemsVerticallyWithPadding(20);
this->addChild(menu);
}
void ItemImage::CallBack1(Ref* sendef)
{
CCLOG("Ok...");
}
void ItemImage::CallBack2(Ref* sendef)
{
CCLOG("Buy...");
}
MenuItemImage的一些重要函数及功能
3. MenuItemSprite
在上面使用MenuItemImage图片菜单项,可以做出漂亮的菜单,但是却不能实现一些特效,例如,让开始菜单闪烁,但是,cocos2d-x提供了MenuItemSprite来实现这样的功能,可以使用MenuItemSprite,该菜单项可以定义为Sprite精灵,这样就可以通过精灵来指定实现的某些特效或者动作了。
实例:
.h files #ifndef _MENUITEMSPRITETEST_SCENE_H_
#define _MENUITEMSPRITETEST_SCENE_H_
#include "cocos2d.h"
class ItemSprite : public cocos2d::Layer
{
private:
cocos2d::Size visible;
cocos2d::Vec2 origin;
public:
static cocos2d::Scene* createScene();
virtual bool init();
void Test();
void CallBack1(Ref* sendef);
void CallBack2(Ref* sendef);
void CallBack3(Ref* sendef);
CREATE_FUNC(ItemSprite);
};
#endif // _MENUITEMSPRITETEST_SCENE_H_ .cpp files #include "MenuItemSpriteTest.h"
USING_NS_CC;
Scene* ItemSprite::createScene()
{
auto scene = Scene::create();
auto layer = ItemSprite::create();
scene->addChild(layer);
return scene;
}
bool ItemSprite::init()
{
if (!Layer::init())
{
return false;
}
visible = Director::getInstance()->getVisibleSize();
origin = Director::getInstance()->getVisibleOrigin();
Test();
return true;
}
void ItemSprite::Test()
{
//第一步:创建精灵
auto sprite1 = Sprite::create("Play.png");
auto sprite2 = Sprite::create("Play1.png");
auto sprite3 = Sprite::create("Help.png");
auto sprite4 = Sprite::create("Help1.png");
auto sprite5 = Sprite::create("About.png");
auto sprite6 = Sprite::create("About1.png");
//缩放精灵的大小
/*sprite1->setScale(0.3, 0.3);
sprite2->setScale(0.3, 0.3);
sprite3->setScale(0.3, 0.3);
sprite4->setScale(0.3, 0.3);
sprite5->setScale(0.3, 0.3);
sprite6->setScale(0.3, 0.3);*/
//第二步:创建精灵执行的动作
auto blink = Blink::create(1, 20);
auto repeat1 = RepeatForever::create(blink);
auto s = RotateBy::create(2, 360);
auto repeat2 = RepeatForever::create(s);
sprite1->runAction(repeat1);
sprite3->runAction(repeat2);
//第三步: 创建菜单项,并将精灵添加到菜单项中
auto item1 = MenuItemSprite::create(sprite1, sprite2, CC_CALLBACK_1(ItemSprite::CallBack1, this));
auto item2 = MenuItemSprite::create(sprite3, sprite4, CC_CALLBACK_1(ItemSprite::CallBack2, this));
auto item3 = MenuItemSprite::create(sprite5, sprite6, CC_CALLBACK_1(ItemSprite::CallBack3, this));
//第四步: 创建菜单,并将菜单项添加到菜单中
auto menu = Menu::create(item1, item2, item3, NULL);
menu->setPosition(Vec2(origin.x + visible.width / 2,
origin.y + visible.height/3));
//和上面的sprite1->setScale(0.3, 0.3);一样的功能;
menu->setScale(0.3, 0.3);
menu->setAnchorPoint(Vec2(0.02, 0));
menu->alignItemsVerticallyWithPadding(3);
this->addChild(menu);
}
void ItemSprite::CallBack1(Ref* sendef)
{
CCLOG("Start Game...");
}
void ItemSprite::CallBack2(Ref* sendef)
{
CCLOG("About Game...");
}
void ItemSprite::CallBack3(Ref* sendef)
{
CCLOG("Help Game...");
}
一些重要的函数和功能
4. MenuItemLabe
在上面的MenuItemFont来创建菜单项,这种创建方法比较的简单,但是效果也比较差。真正的游戏项目不会这样,因为这样的菜单看上去很low,而使用MenuItemLabel创建菜单项,可以为该菜单项指定一个要显示的标签,该标签可以是LabelBMFont,LabelTTF或者LabelAtlas的任意一种。
实例:
.h files #ifndef _MENUITEMLABELTEST_SCENE_H_
#define _MENUITEMLABELTEST_SCENE_H_
#include "cocos2d.h"
class ItemLabel : public cocos2d::Layer
{
private:
cocos2d::Size visible;
cocos2d::Vec2 origin;
public:
static cocos2d::Scene* createScene();
virtual bool init();
void CallBack1(Ref* sendef);
void CallBack2(Ref* sendef);
void CallBack3(Ref* sendef);
void Test();
CREATE_FUNC(ItemLabel);
};
#endif // _MENUITEMLABELTEST_SCENE_H_ .cpp files #include "MenuItemLabelTest.h"
USING_NS_CC;
Scene* ItemLabel::createScene()
{
auto scene = Scene::create();
auto layer = ItemLabel::create();
scene->addChild(layer);
return scene;
}
bool ItemLabel::init()
{
if (!Layer::init())
{
return false;
}
visible = Director::getInstance()->getVisibleSize();
origin = Director::getInstance()->getVisibleOrigin();
this->Test();
return true;
}
void ItemLabel::Test()
{
auto label1 = LabelBMFont::create("Start", "bitmapFontTest3.fnt");
auto label2 = LabelBMFont::create("Help", "bitmapFontTest3.fnt");
auto label3 = LabelBMFont::create("Exit", "bitmapFontTest3.fnt");
auto item1 = MenuItemLabel::create(label1, CC_CALLBACK_1(ItemLabel::CallBack1, this));
auto item2 = MenuItemLabel::create(label2, CC_CALLBACK_1(ItemLabel::CallBack2, this));
auto item3 = MenuItemLabel::create(label3, CC_CALLBACK_1(ItemLabel::CallBack3, this));
auto menu = Menu::create(item1, item2, item3, NULL);
menu->setPosition(Vec2(origin.x + visible.width / 2,
origin.y + visible.height / 2));
menu->alignItemsHorizontallyWithPadding(20);
this->addChild(menu);
}
void ItemLabel::CallBack1(Ref* sendef)
{
CCLOG("Start...");
}
void ItemLabel::CallBack2(Ref* sendef)
{
CCLOG("Help...");
}
void ItemLabel::CallBack3(Ref* sendef)
{
CCLOG("Exit...");
}
一些重要的函数及功能:
Cocos2d-x之Menu的更多相关文章
- Cocos2d中的Menu使用
学习cocos2d-x中的菜单主要须要了解:菜单(CCMenu)和菜单项(CCMenuItem)以及CCMenuItem的详细子类. a. 以下来学习一下相关的类. 1. CCMenu 菜单,是CCL ...
- cocos2d-x教程1 hello world
HelloworldScene.h #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos ...
- cocos2d menu菜单类
// 在init这个函数当中做一些初始化的事情 bool HelloWorld::init() { ////////////////////////////// // 先构造父级对象 if ( !CC ...
- 小尝试一下 cocos2d
好奇 cocos2d 到底是怎样一个框架,正好有个项目需要一个游戏框架,所以稍微了解了一下.小结一下了解到的情况. 基本概念 首先呢,因为 cocos2d 是基于 pyglet 做的,你完全可以直接用 ...
- 学生信息管理系统(cocos2d引擎)——数据结构课程设计
老师手把手教了两天半,看了一下模式,加了几个功能就大功告成了!!! 给我的感想就是全都是指针! 添加图片精灵: CCSprite* spBG = CCSprite::create("&qu ...
- cocos2dx 3.2 Touch Listen和menu回调实现截屏
在Cocos2d-X 3.x里面,已经集成了截屏功能,单独放在utils命名空间里,实现在base/ccUtils.h文件里面.看下函数申明 /** Capture the entire screen ...
- cocos2d学习笔记
doxygen工具 生成cocos2d的api文档 位图字体编辑工具 Glyph Designer http://www.71squared.com/glyphdesigner 收费的 CCLabl ...
- [Cocos2d-x For WP8]Menu菜单
菜单栏这是游戏里面基本的控件来的, 头文件: #include <CCMenu.h> 继承关系图: 头文件: #include < ...
- Cocos2d-android (01) 创建一个简单的cocos2d应用程序
下载Cocos2d-android的源代码:cocos2d-android-1 git@github.com:ZhouWeikuan/cocos2d.git 将项目导入到eclipse中.运行实例: ...
- Cocos2d html5 笔记 1: overview
昨天接触到了cocos2d-html5的的东东了, 第一次看其源代码一头雾水,幸好samples目录下面有几个例子,可以从这个入手. MoonWarriors是一个射击类的游戏, 有点像以前玩的雷电, ...
随机推荐
- rabbitMQ实现推迟队列
一. 使用原生Api 1.RabbitMQ 相关 <dependency> <groupId>com.rabbitmq</groupId> <artifact ...
- Python中字符串的格式化
字符串的格式化 格式化是对字符串进行格式表示的方式.使用槽({})按顺序格式化字符串. 格式化方式 <模板字符串>.format(<逗号分割参数>) "{ }:计算机 ...
- ed-tue-robotics
https://github.com/tue-robotics/ed ubuntu16.04 安装libsdformat4-dev ,libsdformat4 1./usr/include/sdfor ...
- HDU 6613 Squrirrel 树形dp
题意:给你一颗树,你可以把这棵树上的一条边的边权变为0,现在让你选一个根,让所有点到这个点的最大距离尽量的小.如果有多个根的最大距离距离相同,输出编号最小的边. 思路:如果没有把边权变为0的操作,这个 ...
- Axis2 客户端调用 设置超时时间
我用的是axis2-1.6.2版本.请看下面的客户端代码: import org.apache.axis2.client.Options; import com.ctis.ta.service.imp ...
- mongodb 面试题
mongodb 面试题总结 1 nosql和关系型数据库的区别 NoSQL是非关系型数据库,NoSQL = Not Only SQL. 关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存 ...
- hdu4336 Card Collector MinMax 容斥
题目传送门 https://vjudge.net/problem/HDU-4336 http://acm.hdu.edu.cn/showproblem.php?pid=4336 题解 minmax 容 ...
- Uva10491 Cows and Cars 【迁移自洛谷博客】
题目大意 假设有a头牛,b辆车(门的总数为a+b),你先选一个门,然后你最终选择前主持人会替你打开C扇有牛的门(不会打开你已经选择的门),问你要不要换门,输出"总是换门"的策略下, ...
- Yii2.0基础框架
前言:最近在用php写一个项目的接口,所以需要学习一下Yii的框架,也在这里记录一下. 整体结构 ssets文件夹:assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问p ...
- 03 spring security执行流程分析
spring security主要是依赖一系列的Filter来实现权限验证的,责任链设计模式是跑不了的.下面简单记录一下spring操作这些Filter的过程. 1. WebSecurityConfi ...