微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Cocos2d-x 3.2 之 别踩白块第三篇

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************



别踩白块,第三篇。。。

距离第二篇都快过去半年了。。。

一直没抽出时间来完善它,

这次简单的完善一下:

> 触摸屏蔽

> 最高分的存储

> 时间显示优化

> 初始化优化

主要就是这几方面的优化了,其他杂七杂八的,就没有列出了,可以参考源码



1. 触摸屏蔽

每次踩到白块,如果不屏蔽触摸,就会发生很糟糕的小编(可以继续玩下去,直到跳到下一个场景)。

所以,我们需要实现 触摸的屏蔽

这里,我直接新建了一个继承自Layer的类,然后在该加的地方 create 然后 addChild就行了,

很简洁,重用性也高:

// SwallowLayer.h  

#include "cocos2d.h"

USING_NS_CC;

class SwallowLayer : public Layer
{
public:
	/***** 初始化函数 *****/
	virtual bool init();  
	CREATE_FUNC(SwallowLayer);

};

// SwallowLayer.cpp

#include "SwallowLayer.h"

bool SwallowLayer::init( )	
{
	if( !Layer::init() )	{
		return false;
	}

    // 添加监听器
	auto listener = EventListenerTouchOneByOne::create();
	listener->onTouchBegan= [this](Touch* t,Event* e){
		cclOG("touch swallow layer");
		return true;
	};
	listener->setSwallowtouches(true);
	Director::getInstance()->getEventdispatcher()->addEventListenerWithSceneGraPHPriority(listener,this);


	return true;
}

原理,很简单,就是新建一个层,把触摸事件吞掉。




2.最高分的存储

这个,说过很多遍了,主要是想讲一下,用一个结束界面,再玩不同模式时,显示不同模式的数值,

比如,我这个游戏有两个模式:固定时间 和 固定行数。

每次游戏结束,都要向游戏结束界面层传递些数据,

比如,玩家是否完成游戏,如果是 固定时间 模式,完成后,走了多少行;如果是 固定行数 模式,花了多少时间?

我的方法,就是在游戏结束层,进行函数的重载:

//接受模式(Limit Block OR Limit Time ),// true 为LimitBlocks,false为LimitTime
void createText( bool mode,double num );
void createText( bool mode );

一个函数,其实表示的是,玩家完成游戏,传递 模式 和 分数(时间、行数),

第二个函数,表示的是,游戏失败(踩到白块啦~),所以,直接传递模式(用来显示,最高分)。

void GameOver::createText( bool mode,double num )
{
	if( mode )	{
		// 获取最高分
		double highest = UserDefault::getInstance()->getDoubleForKey("HIGHESTTIME",0);

		cclOG("highest time %f",highest);


		auto _highest = Label::create(StringUtils::format("Highest: %.2f",highest),"fonts/Marker Felt.ttf",34);
		_highest->setTextColor(Color4B::RED);
		_highest->setPosition(visibleSize.width/2+100,visibleSize.height/2+100);
		this->addChild(_highest);

		auto _score = Label::create(StringUtils::format("Yours: %.2f",num),60);
		_score->setTextColor(Color4B::BLUE);
		_score->setPosition(visibleSize.width/2,visibleSize.height/2-50);
		this->addChild(_score);

		if( highest > num || highest == 0 )	{
			cclOG("this time %f",num);
			UserDefault::getInstance()->setDoubleForKey("HIGHESTTIME",num);
			cclOG("this highest time %f",UserDefault::getInstance()->getDoubleForKey("HIGHESTTIME",num));
		}
	}
	else
	{
		// 获取最高分
		int highest = UserDefault::getInstance()->getIntegerForKey("HIGHESTBLOCKS",0);

		auto _highest = Label::create(StringUtils::format("Highest: %d",visibleSize.height/2+100);
		this->addChild(_highest);

		auto _score = Label::create(StringUtils::format("Yours: %d",(int)num),visibleSize.height/2-50);
		this->addChild(_score);

		if( highest < num )	{
			UserDefault::getInstance()->setIntegerForKey("HIGHESTBLOCKS",(int)num);
		}
	}
}

void GameOver::createText( bool mode )	
{
	// mode——true:Limit Block,false:Limit Time
	if( mode )	{
		// 获取最高分
		double highest = UserDefault::getInstance()->getDoubleForKey("HIGHESTTIME",0);

		auto _highest = Label::create(StringUtils::format("Highest: %.2f",visibleSize.height/2+100);
		this->addChild(_highest);
	}
	else
	{
		// 获取最高分
		long highest = UserDefault::getInstance()->getIntegerForKey("HIGHESTBLOCKS",visibleSize.height/2+100);
		this->addChild(_highest);
	}

	auto _label = Label::create("Fail!",60);
	_label->setTextColor(Color4B::RED);
	_label->setPosition(visibleSize.width/2,visibleSize.height/2-50);
	this->addChild(_label);

}





3.时间显示的优化

之前做的时间显示,晃得眼睛疼,

而且,后来调试的时候,发现可能乱码,

所以,获取系统时间函数改了一个

double modeLimitTime::getMillSecond()
{
    struct timeval tv;
    gettimeofday(&tv,nullptr);
    
    cclOG("CurrentTime MillSecond %f",(double)tv.tv_sec * 1000 + (double)tv.tv_usec / 1000);

    return (double)tv.tv_sec * 1000 + (double)tv.tv_usec / 1000;
}

输出的时候,只输出小数点后两位:
//时间的偏差
_time = (getMillSecond()-startTime)/1000.0;
cclOG("SubTime MillSecond %f",_time);
//强转offset为double类型
timerLabel->setString(StringUtils::format("%.2f",_time));




4.初始化优化

这个是我后来运行的时候,发现,每次都有些数据滞留,并没有清空,

找到最后,发现是Block的Vector没有清空,

所以在游戏结束的时候,一定不要忘了将游戏数据清空:

// 将Vector清空,避免影响后面游戏
auto bs = Block::getBlocks();
bs->clear();





Ok,暂时就是这些了,

接下来的时间,我要准备准备考试什么的了。。


源码: > 这里 <

APK: > 这里 <




******************************************

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建