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.width/2,visibleSize.height/2));
this->addChild(_label);
//另外的一种创建 auto _label = Label::createWithSystemFont(“嗨喽,你好”,“宋体”,66); 注意:这windows环境下显示出来是乱码,原因是因为windows中文环境采用的是GBK编码,源程序文件默认也是GBK编码 解决方案:使用配置方式读取中文
#pragma once
USING_NS_CC
class ChineseDemo:public Scene
{
public:
static Scene* createScene();
virtual bool init();
CREATE_FINC(ChineseDemo);
private:
map<int,Value>ptr_cnWords;
string prt_content;
Label* prt_label;
}
Scene* ChineseDemo::createScene()
{
return ChineseDemo::create();
}
bool ChineseDemo::init()
{
if(!Scene::init()) return false;
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_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;
}
else
{
i++;
}
std::string str = ptr_content.substr(0,i);
prt_label -> setString(str);
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();
void menuCloseCallback(cocos2d::Ref* pSender);
CREATE_FUNC(HelloWorld);
private:
Button* createDirButton(float rotation,Vec2 position);
};
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 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));
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();
virtual bool init();
CREATE_FINC(MenuScene);
private:
Menu* prt_menu;
MenuItemLabel*prt_labelItem;
MenuItemToggle*prt_toggleItem;
MenuItemSprite*prt_seletedItem;
MenuItemSprite*prt_unseletedItem;
}
Scene* MenuDemo::createScene()
{
return MenuDemo::create();
}
bool MenuDemo::init()
{
if(!Scene::init()) return false;
auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
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));
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();
|