cocos2dx学习之路(三)

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* nameconst char* std::string::c_str()
cocos2d::String转为std::stringstd::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();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恒德久远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值