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

Cocos2d-x 3.2 之 别踩白块(第三篇),第1张

概述***************************************转载请注明出处:http://blog.csdn.net/lttree****************************************** 别踩白块,第三篇。。。 距离第二篇都快过去半年了。。。 一直没抽出时间来完善它, 这次简单的完善一下: > 触摸屏蔽 > 最高分的存储 > 时间显示优化 > 初始化优

***************************************转载请注明出处: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为limitTimevoID 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: > 这里 <




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

总结

以上是内存溢出为你收集整理的Cocos2d-x 3.2 之 别踩白块(第三篇)全部内容,希望文章能够帮你解决Cocos2d-x 3.2 之 别踩白块(第三篇)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1063041.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存