前言

前一篇博文讲述了项目的架构,从中也可以看出Gametool 的主要功能是显示并随时更新分数和最高分数,其中主要用到的是Label

设计

Gametool主要包括三个Label,用于显示标题的2048+,显示分数的score, 最高分的Best;其中标题与另外两个区别在于没有背景,且内容不可更改(本项目设置为不可改)

1. 创建标签

对于这三个标签而言,创建流程相差无机,具体代码如下:

auto layerIcon = LayerColor::create(Color4B(230,230,0),100,60);
auto label = Label::createWithSystemFont("2048+","Arial",36);
//auto label = Label::createWithTTF("小兵传奇","ClearSansBold.ttf",36);
label->setTextColor(Color4B(134,134,255));
label->setPosition(60,30);
layerIcon->addChild(label);
this->addChild(layerIcon);

代码分析:

背景创建: LayerColor::create(Color4B(230,255),60);

表示生成一个色块,大小为(100,60),颜色为(230,230,0,255)最后一个为透明度(255不透明),LayerColor继承Layer而来,本处使用主要是用于创建label的背景

标签创建: Label::createWithSystemFont(“2048”,“Arial”,36);

创建标签,用于显示内容,上面表示的是用默认字体创建,也可以利用其他的方式如 createWithTTF,createWithBMFont等,利用vs时会有相关提示(直白来说就是看你选择的是什么字体,fnt? ttf? )

创建Label之后,可以设置相关属性,这里主要提及的是设置字体颜色, setTextColor(Color4B(…)),setString(…),setPosition(Vec2(60,30)); 对于设置位置需要记住Label的锚点是在正中心,因此其坐标不应该设置为父节点的(0,0)处

添加子节点: addChild(node)

2. 分数更新

这里添加了两个变量_score,_bestScoer, 分别保存当前的分数和最高分,当滑动合并方块时,需要更新分数,当当前分数大于最高分时需要更新最高分

int Gametool::getscore()
{
	return _score;
}

void Gametool::setscore(int score)
{
	_score = score;
	scoreLabel->setString(Value(_score).asstring());
}

int Gametool::getBestscore()
{
	return _bestscore;
}
void Gametool::setBestscore(int bestscore)
{
	_bestscore = bestscore;
	bestLabel->setString(Value(_bestscore).asstring());
}

void Gametool::updatescore(int addscore)
{
	setscore(_score + addscore);
	updateBestscore(); // update the bset score if necessary
}

void Gametool::resetscore()
{
	setscore(0);
}

void Gametool::updateBestscore()
{
	if(_score < _bestscore)
		return ;

	setBestscore(_score);
}

上面的代码很容易理解, 这里额外提一下Cocos2dx中声明了一个宏 CC_SYINTHESIZE, 用于集成类变量的声明,并自动实现getXXX()和setXXX(…),本处没有使用是因为在setscore函数中需要对_socreLabel的内容值同步进行更新

3. 类型转换

上面的代码

bestLabel->setString(Value(_bestscore).asstring());
中涉及到了类型转换,将int转换为std::string 类型


Value是cocos2dx-3.x版本新引入的容器,可以实现基本类型的转换,其使用规则基本如上所示, 创建一个Value()对象,并调用asXXX()转换为相应的数据类型即可

实现

本类的设计非常简单,上面基本列出所有的功能点,下面贴出本类的代码以供参考:

#pragma once
#include "cocos2d.h"

USING_NS_CC;

class Gametool :
	public cocos2d::Layer
{
public:
	static Gametool* getInstance();

	virtual bool init();
	virtual bool initscore();
	void loadscore(int type);
	void updatescore(int addscore);
	void resetscore();

	void setscore(int score);
	int getscore();
	void setBestscore(int bestscore);
	int getBestscore();
private:
	CREATE_FUNC(Gametool);
	void updateBestscore();

	Label* scoreLabel;
	Label* bestLabel;

	int _score;
	int _bestscore;
	static Gametool* _instance;
};
#include "Gametool.h"
#include "DataConf.h"

Gametool* Gametool::_instance = nullptr;
Gametool* Gametool::getInstance()
{//采用单例模式创建对象
	if(_instance==nullptr)
		_instance = create();
	return _instance;
}

bool Gametool::init()
{
	do{
		CC_BREAK_IF(!Layer::init());
		// set tool layer's size and position
		this->setContentSize(Size(300,60));
		this->setPosition(10,410);
		auto layerIcon = LayerColor::create(Color4B(230,60);
		auto label = Label::createWithSystemFont("2048+",36);
		//auto label = Label::createWithTTF("小兵传奇",36);
		label->setTextColor(Color4B(134,255));
		label->setPosition(60,30);
		layerIcon->addChild(label);
		this->addChild(layerIcon);

		initscore();
	}while(0);
	return true;
}

bool Gametool::initscore()
{
	auto scoreIcon = LayerColor::create(Color4B(186,172,159,80,50);
	auto scoreTitleLabel = Label::createWithSystemFont("score",16);
	scoreTitleLabel->setPosition(40,35);
	scoreIcon->setPosition(Vec2(130,5));
	scoreIcon->addChild(scoreTitleLabel);

	scoreLabel = Label::createWithSystemFont(Value(_score).asstring(),20);
	scoreLabel->setPosition(40,10);
	scoreIcon->addChild(scoreLabel);
	this->addChild(scoreIcon);


	auto bestIcon = LayerColor::create(Color4B(186,50);
	auto bestTitleLabel = Label::createWithSystemFont("BEST",16);
	bestTitleLabel->setPosition(40,35);
	bestIcon->setPosition(Vec2(220,5));
	bestIcon->addChild(bestTitleLabel);

	bestLabel = Label::createWithSystemFont(Value(_bestscore).asstring(),20);
	bestLabel->setPosition(40,10);
	bestIcon->addChild(bestLabel);
	this->addChild(bestIcon);

	// 首次从文件中读取最高分
	loadscore(UserDefault::getInstance()->getIntegerForKey("type",1));
	return true;
}
// 从记录中获取当前分数和最高分
void Gametool::loadscore(int type)
{
	setscore(UserDefault::getInstance()->getIntegerForKey(Value(type).asstring().append("score").c_str(),0));
	setBestscore(UserDefault::getInstance()->getIntegerForKey(Value(type).asstring().append("best_score").c_str(),0));
}

int Gametool::getscore()
{
	return _score;
}

void Gametool::setscore(int score)
{
	_score = score;
	scoreLabel->setString(Value(_score).asstring());
}

int Gametool::getBestscore()
{
	return _bestscore;
}
void Gametool::setBestscore(int bestscore)
{
	_bestscore = bestscore;
	bestLabel->setString(Value(_bestscore).asstring());
}

void Gametool::updatescore(int addscore)
{
	setscore(_score + addscore);
	updateBestscore(); // update the bset score if necessary
}

void Gametool::resetscore()
{
	setscore(0);
}

void Gametool::updateBestscore()
{
	if(_score < _bestscore)
		return ;

	setBestscore(_score);
}

cocos2dx-v3.5 2048 (二: GameTool的设计与实现的更多相关文章

  1. 移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. ios – 在applicationWillEnterForeground触发时更改UIView

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  3. UILabel导致应用程序在添加到视图时崩溃(仅限Xcode 6和iOS 8)

    我已将我的项目转换为Xcode6,以便为iOS8构建.但是,特定的UILabel会导致应用程序在添加到视图层次结构时崩溃.这是我收到的唯一错误日志:我无法在项目中的任何位置找到contentInsetsFromFonts方法.此外,我甚至无法在网上任何地方找到它的参考,包括Apple的文档.我没有为这个UIViewController使用NIB,因此UI是在loadView方法中构建的:该应用程序

  4. iOS 7通知中心与标签一样

    您可以试试,也许在将模糊应用到标签之前为模糊添加一点白色.

  5. iOS safari输入插入颜色

    我在iPhone设备上有一个小的CSS问题.我的搜索输入为蓝色,当用户关注它时,插入符号几乎不可见:在所有桌面浏览器中,即使在桌面Safari上,它也具有正确的颜色(白色).知道如何修复此问题并更改iOS设备上的插入颜色吗?

  6. 如何计算iOS 7中的实际字体大小(不是边框)?

    编辑:链接的“重复”问题仅涉及计算文本矩形.我需要在标签缩放之后计算实际字体大小,而不是字符串大小.此方法现已弃用:如何在iOS7中计算UILabel的字体大小,以缩小文字大小以适应?

  7. ios – 为什么在presentmodalviewcontroller调用时,navigationItem.titleView会左对齐?

    我正在使用UILabel作为导航栏的titleView.它工作正常,除了当我呈现模态视图控制器时,titleView从导航栏的中心移动到最左边.我在3.0及以上测试过.这是相关代码:截图:知道为什么会这样吗?

  8. ios – 在XCode中的UI测试期间无法访问自定义视图

    我们必须执行一些时髦的动画,这是我们最好的布局).问题是我无法访问此视图以模拟其上的点击.我可以使用app.staticText[“输入名称…”]访问标签,但是如果我点击它.记录我点击标签的会话将产生app.staticText[“输入名称…”

  9. ios – UITableView以编程方式调用滑动操作

    我有一个UITableView,用户可以向左滑动以显示动作.这一切都按预期工作.当用户点击单元格的某个部分时,我想触发这个.如何以编程方式调用此幻灯片动作?

  10. ios – 在SpriteKit中创建按钮:Swift

    我想在SpriteKit或SKScene中创建一个按钮,将视图发送到另一个视图控制器.我尝试使用“performSeguewithidentifier”,但显然SKScene不支持此功能.如何使用SpriteKit创建一个将视图发送到另一个视图的按钮?这是我尝试用来执行此操作的代码.带有“HomeButton.prepareForSegueWithIdentifier()”的行只是一个例子.它实际

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部