Director类:
Node和Director是并列的都是继承自Ref。
Ref是cocos2d中的一个内存管理机制。Director自己封装了一个单例的数据模式,而Node是Creater的一个构建模式。
Creater是受Director管控的。
Director类的职责:
1、访问和切换场景
2、访问Cocos2d-x的配置信息
3、暂停、继续和停止游戏
4、转换坐标
Director类的使用:
访问场景
Director::runWithScene(Scene* scene)
替换场景
Director::replaceScene(Scene* scene)
掌握String类的使用
了解常见的几种标签
掌握标签的使用
掌握按钮的使用
了解Cocos2d-x中的菜单
掌握菜单的使用方式
C语言、C++、Cocos2d-x字符串风格对比
字符串类型 | 字符串风格 |
---|---|
C语言风格的字符串 | const char* |
C++语言风格的字符串 | std::string |
Cocos2d-x引擎提供的字符串 | cocos2d::String |
C语言、C++、Cocos2d-x字符串相互转换
转换类型 | 方法 |
---|---|
std::string转为const char* name | const char* std::string::c_str() |
cocos2d::String转为std::string | std::string cocos2d::String::getCString() |
//3.1版本前
String* content = String::create(“Hello,you”);
String* content = String::createWithFormat(“www.%s.com”,“baidu”);
content->append(".cn");
显示结果是:www.baidu.com.cn
String只能在3.1版本前使用,后边的版本被StringUtils;替换掉了。
#include
std::string na = StringUtils::format(“www.%s.com”,“baidu”);
控制台打印字符串长度:
CCLOG(“string length:%d”,content->length());
#define USING_NS_CC using namespace cocos2d
String类的使用
常用方法 | 方法说明 |
---|---|
String* String::create(const std::string&) | 创建String指针 |
String* String::createWithFormat(const char*,…) | 格式化创建String指针 |
void String::append(const std::string&) | 附加字符串 |
int String::length() | 获取字符串的长度 |
int String::intValue() | 转换为int型 |
标签Label类:
Cocos2d-x中的字体
BMFont
TTF(TrueTypeFont)
SystemFont
创建BNFont需要.fnt和.png文件。
BMFont,如果想不失真的缩放,就要提供多种字体文件。
使用TTF很方便,不需要为每种尺寸和颜色单独使用字体文件。
创建Label标签:
Label::create(“My Label Text”,“Arial”,20);
Label::createWithTTF(“myFont.ttf”,“My Label Text”,20);
Label* _label = Label::create("Hello World!","arial",72);
_label->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
//坐标位置设置在屏幕正中心
//_label->setPosition(Vec2(visibleSize/2));等同于
_label->setPosition(Vec2(visibleSize.width/2,visibleSize.height/2));
this->addChild(_label);
//另外的一种创建
auto _label = Label::createWithSystemFont(“嗨喽,你好”,“宋体”,66);
注意:这windows环境下显示出来是乱码,原因是因为windows中文环境采用的是GBK编码,源程序文件默认也是GBK编码
解决方案:使用配置方式读取中文
//创建一个读取xml文件类
//.h文件
#pragma once
USING_NS_CC
class ChineseDemo:public Scene
{
public:
static Scene* createScene();
//初始化界面的一些UI组件,和数据
virtual bool init();
//生成ChineseDemo构造和析构
CREATE_FINC(ChineseDemo);
private:
//记录中文字集合key:文字编号 value:中文字
map<int,Value>ptr_cnWords;
//记录当前文字内容
string prt_content;
//记录标签UI空间
Label* prt_label;
}
//.cpp文件
Scene* ChineseDemo::createScene()
{
return ChineseDemo::create();
}
bool ChineseDemo::init()
{
//父类初始化失败
if(!Scene::init()) return false;
//以前的写法
//do
//{
//CC_BREAK_IF(!Scene::init())
//}while(0);
//获取XML数据
auto configData = FileUtils::getInstance()->getValueMapFromFile("文件具体路径");
//解析配置数据
for(auto valPair:configData)
{
//文字编号
int key = atoi(valPair.first.c_str());
//中文字
Value val = valPair.second;
ptr_cnWords.instert(pair<int,Value>(key,val));
}
return true;
}
AppDelegate里边调用:
auto scene = ChineseDemo::creatScene();
HelloWordScene.cpp显示:
//获取屏幕显示大小
auto visibleSize = Director::getInstance() ->getVisibleSize();
auto _label = Label::createWithSystemFont(ptr_cnWords.at(100).asString(),"微软雅黑",26);
_label->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
//坐标位置设置在屏幕正中心
_label->setPosition(Vec2(visibleSize/2));
this->addChild(_label);
标签效果:(4B是RGB带阿尔法通道的,3B是不带)
标签效果 | Label的方法 |
---|---|
阴影 | void enableShadow(const Color4B& shadowColor = Color4B::BLACK,const Size &offset = Size(2,-2),int blurRadius = 0 ) |
描边 | void enableOutline(const Color4B& outlineColor,int outlineSize = -1 ) |
发光 | void enableGlow(const Color4B& glowColor) |
斜体 | void enabletalics() |
加粗 | void enableBold() |
下划线 | void enableUnderline() |
删除线 | void enableStrikethrough() |
使用文本标签实现打字机效果,要求:
1、控制每行字数自动换行
2、文字字体使用方正姚体
3、字体加粗
4、颜色如演示所示
5、实现打字机效果
如图所示:
//创建背景图片
auto sprite = Sprite::create("bg.jpg");
sprite -> setAnchorPoint(Vec2::ANCHOR_MIDDLE);
sprite -> setPosition(Vec2(visibleSize / 2));
this -> addChild(sprite);
//显示文字内容
prt_content = ptr_cnWords.at(100).asString();
//表示加载指定位置prt_content的文字
//prt_label = Label::create(prt_content,"方正姚体",24);
//"" 标识默认什么都不显示,然后一点点开始加
prt_label = Label::create("","方正姚体",24);
prt_label->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
prt_label->setPosition(Vec2(visibleSize / 2));
prt_label->setColor(Color3B(255,0,200));
prt_label->enableBold();
//文字宽度
prt_label->setDimensions(330,0);
this -> addChild(prt_label);
//实现打字效果
static int i =0;
//开启一个调度器(没有撤销的话,会一直运行,后边的逻辑是全部都不会执行的,类似线程)
this->schedule([&](float dlt) {
//获取当前下标的字符
char ch = prt_content[i];
//判断该字符是否为中文
if(ch > -127 && ch < 0){
i+=3;//中文加3
}
else
{
i++;//英文加1
}
//截取字符串
std::string str = ptr_content.substr(0,i);
prt_label -> setString(str);
//当i超过字符串长度的时候,注销调度器
if(i > ptr_content.length())
{
this-> unschedule("schedule_callback");
}
},0.1f,"schedule_callback");
return true;
按钮
文字按钮创建的步骤:
创建按钮对象
设置按钮字样
添加按钮事件
加入到容器
auto button = Button::create("normal_image.png","selected_image.png","disabled_image.png");//创建按钮
button->setTitleText("Button Text");//设置按钮字样,默认显示空字符串
//添加按钮事件
button -> addTouchEventListener()[&](Ref* sender,widget::TouchEventType type)
{
switch (type)
{
case ui::widget::TouchEventType::BEGAN:break;
case ui::widget::TouchEventType::ENDED:
std::cout<<"Button 1 clicked"<< std::endl;break;
default:break;
}
});
this->addChild(button);//将按钮添加到容器中
#include"ui/CocosGUI.h"
using namespace ui;
//创建一个游戏开始按钮
auto button = Button::create("temp1.png","temp2.png","temp3.png");
button->setTitleText("Start");//设置按钮字样
button->setTitleFontSize(70);//设置按钮字样的字号
button->setColor(Color3B::RED);//设置按钮的前景色
button->setPosition(Vec2(visibleSize / 2));//设置按钮的 坐标位置
this->addChild(button);//将按钮加入容器
//禁用按钮
button -> setEnabled(false);
//将按钮向右方向箭头"→"旋转朝上"↑"
button -> setRotation(-90);
按钮的使用:
实现控制精灵上下左右改变位置的方向键。
要求:创建四个方向的按钮
class HelloWorld : public cocos2d::Scene
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
// a selector callback
void menuCloseCallback(cocos2d::Ref* pSender);
// implement the "static create()" method manually
CREATE_FUNC(HelloWorld);
private:
//创建方向按钮
Button* createDirButton(float rotation,Vec2 position);
};
//.cpp
Button*HelloWorld::createDirButton(float rotation,Vec2 position)
{
//创建一个游戏开始按钮
auto button = Button::create("temp1.png","temp2.png","temp3.png");
button->setTitleFontSize(70);//设置按钮字样的字号
//将按钮向右方向箭头"→"旋转朝上"↑"
button -> setRotation(rotation);
//设置坐标的位置
button->setPosition(position);
//创建向右的按钮并加入容器
Vec2 base = Vec2(visibleSize.width / 2,0);
auto rightBtn = createDirButton(0,base);
this->addChild(rightBtn);
float width = rightBtn->getContentSize().width;
float height = rightBtn->getContentSize().height;
base = base + Vec2(0,height);
rightBtn->setPosition(base + Vec2(width,0));
//创建向下的按钮并加入容器
this->addChild(createDirButton(90,base);
//创建向左的按钮并加入容器
this->addChild(createDirButton(180,base + Vec2(-width,0)));
//创建向上的按钮并加入容器
this->addChild(createDirButton(270,base +Vec2(0,height)));
return true;
}
菜单
Menu类
继承自Layer类,是一个层容器,用来装UI组件。
只能添加Menultem对象
MenuItem包含三个子节点:
1、MenuItem Label 文本菜单
有两个子类(两种字体):
MenuItem AtlastFont
MenuItem Font
2、MenuItem Toggle 开关菜单
3、MenuItem Sprite 图片菜单
子类:MenuItem Image
bool HelloWorld::init(){
/* auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
if (closeItem == nullptr ||
closeItem->getContentSize().width <= 0 ||
closeItem->getContentSize().height <= 0)
{
problemLoading("'CloseNormal.png' and 'CloseSelected.png'");
}
else
{
float x = origin.x + visibleSize.width - closeItem->getContentSize().width/2;
float y = origin.y + closeItem->getContentSize().height/2;
closeItem->setPosition(Vec2(x,y));
}*/
auto spriteNormal = Sprite::create("CloseNormal.png");
auto spriteSlected = Sprite::create("CloseSelected.png");
auto selectedItem = MenuItemSprite::create(spriteSlected, spriteSlected);
auto NormalItem = MenuItemSprite::create(spriteNormal, spriteNormal);
//创建一个开关菜单项
auto toggleItem = MenuItemToggle::createWithCallback(CC_CALLBACK_1(HelloWorld::menuCloseCallback, this), selectedItem, NormalItem,NULL);
float x = origin.x + visibleSize.width - toggleItem ->getContentSize().width/2;
float y = origin.y + toggleItem ->getContentSize().height/2;
toggleItem ->setPosition(Vec2(x,y));
// create menu, it's an autorelease object
auto menu = Menu::create(toggleItem, NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu, 1);
}
实现一个如图所示的静音设置
要求:
使用MenuItemSprite类加载图标
使用MenuItemToggle类控制静音
使用MenuItemLabel类显示文字
#pragma once
USING_NS_CC
class MenuScene:public Scene
{
public:
static Scene* createScene();
//初始化界面的一些UI组件,和数据
virtual bool init();
//生成MenuDemo构造和析构
CREATE_FINC(MenuScene);
private:
//记录中文字集合key:文字编号 value:中文字
//菜单
Menu* prt_menu;
//文本菜单项
MenuItemLabel*prt_labelItem;
//开关菜单项
MenuItemToggle*prt_toggleItem;
//选中精灵菜单项
MenuItemSprite*prt_seletedItem;
//未选中精灵菜单项
MenuItemSprite*prt_unseletedItem;
}
//.cpp文件
Scene* MenuDemo::createScene()
{
return MenuDemo::create();
}
bool MenuDemo::init()
{
//父类初始化失败
if(!Scene::init()) return false;
auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
//创建两个精灵(假设有这两个图片unselected.png)
auto unselected = Sprite::create("unselected.png");
return true;
auto selected = Sprite::create("selected.png");
//创建两个精灵菜单项
auto unselecteSpriteItem = MenuItemSprite::create(unselected ,unselected);
auto selecteSpriteItem = MenuItemSprite::create(selected ,selected);
//创建一个开关菜单项
auto toggleItem = MenuItemToggle::createWithCallback([&](Ref* ref)
{
auto item = dynamic_cast<MenuItemToggle*>(ref);
//声音播放的控制
if(item )
{
if(item ->getSelectedIndex()== 0)
{
CCLOG("Play sound");
}
else if(item ->getSelectedIndex()== 1)
{
CCLOG("Silence");
}
}
},unselecteSpriteItem ,selecteSpriteItem,NULL);
toggleItem->setAnchorPoint(Vec2::ANCHOR_MIDDLE_RIGHT);
toggleItem->setPosition(Vec2(visbleSize / 2) + Vec2(-20,0));
//创建一个文本菜单项,显示Silence字样
Label*label = Label::create("Silence","Arial",36);
auto labelItem = MenuItemLabel::create(label,NULL);
labelItem ->setAnchorPoint(Vec2::ANCHOR_MIDDLE_LEFT);
labelItem ->setPosition(Vec2(visibleSize / 2));
//创建一个菜单
Menu* menu = Menu::create(toggleItem,labelItem,NULL);
menu->setPosition(Vec2::ZERO);
this->addChild(menu);
return true;
}
AppDelegate里边调用:
auto scene = MenuDemo::creatScene();