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;
}
原理。非常easy,就是新建一个层,把触摸事件吞掉。
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),"fonts/Marker Felt.ttf",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",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: %d",(int)num),"fonts/Marker Felt.ttf",60);
_score->setTextColor(Color4B::BLUE);
_score->setPosition(visibleSize.width/2,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",highest),"fonts/Marker Felt.ttf",34);
_highest->setTextColor(Color4B::RED);
_highest->setPosition(visibleSize.width/2+100,visibleSize.height/2+100);
this->addChild(_highest);
}
else
{
// 获取最高分
long highest = UserDefault::getInstance()->getIntegerForKey("HIGHESTBLOCKS",0); auto _highest = Label::create(StringUtils::format("Highest: %d",highest),"fonts/Marker Felt.ttf",34);
_highest->setTextColor(Color4B::RED);
_highest->setPosition(visibleSize.width/2+100,visibleSize.height/2+100);
this->addChild(_highest);
} auto _label = Label::create("Fail!","fonts/Marker Felt.ttf",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: >
这里 <
***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************
Cocos2d-x 3.2 之 别踩白块(第三篇)的更多相关文章
- JS实现别踩白块小游戏
最近有朋友找我用JS帮忙仿做一个别踩白块的小游戏程序,但他给的源代码较麻烦,而且没有注释,理解起来很无力,我就以自己的想法自己做了这个小游戏,主要是应用JS对DOM和数组的操作. 程序思路:如图:将游 ...
- cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现
一.创建GameScene以及GameLayer 就是简单创建一个Scene而已,在此就不多说啦~,可以参照我的打飞机的学习笔记(2). 二.添加一个开始栏 很简单,就是调用Block中的create ...
- ios-高仿别踩白块游戏的实现
先看下效果图片 前几天看到一个游戏叫别踩白块,下载量还挺大几百万了都,下载下来玩了玩看了看,这个游戏还挺简单的.俗话说想一千遍,一万遍不如动手做一遍来的实在.昨晚以及今天白天闲的没事就开搞了,下午六点 ...
- jquery之别踩白块游戏的实现
转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5687112.html 前端学习要告一段落了,也没机会写什么像样的东西,然后无意中想起某人以前给我玩了一下别踩白块的游 ...
- 用javascript做别踩白块游戏2
这一次做一个好一点的,要求黑块自动下落,且速度逐渐加快 <!DOCTYPE html> <html> <head> <!-- 禁用缩放功能 --> &l ...
- 用javascript做别踩白块游戏1
初学Javascript做的一个别踩白块小游戏,代码简陋,如下: <!DOCTYPE html> <html> <head> <!-- 禁用缩放功能 --&g ...
- jquery 简单的别踩白块小游戏
写写简单的东西,效果如图: 1.html代码 <div class="warp"> <div class="title"> <h3 ...
- C++用EGE简单实现别踩白块游戏
本项目已开源:https://github.com/wmpscc/AvoidBlank 关于EGE 介绍:EGE(Easy Graphics Engine),是windows下的简易绘图库,是一个类似 ...
- cocos2dx游戏开发——别踩白块学习笔记(一)——Block类
一.Block类介绍 当然啦,Block类在这个游戏里就是必需品= =,因为整体都是由这个搞出来的,所以我们可以把游戏需要实现的功能都放在这里. 主要有下面这些功能(经典模式): 1.创建一个Bloc ...
随机推荐
- phpredis Floating point exception
发生在高版本的gcc编译后的so用于低版本gcc编译出来的php, 解决方法, 加上参数-Wl,--hash-style=sysv phpize ./configure vi Makefile CC ...
- 打包工具 使用帮助 inno setup
http://wenku.baidu.com/link?url=0VRJ8n9am1KgVAAqwz-AU1htXamo7Vh0d4QIdGG6_LcTrZBdb7lRim8Jx6M8KaLJDQm1 ...
- Chrome的开发必备小技巧
谷歌Chrome,是当前最流行且被众多web开发人员使用的浏览器.最快六周就更新发布一次以及伴随着它不断强大的开发组件,使得Chrome成为你必备的开发工具.例如,在线编辑CSS,console以及d ...
- 谈谈 ES7、ES8、ES9 和 Stage 3 的那些事儿
ES6 作为多年来 JavaScript 的重大版本变革,受到 JavaScript 开发者们的普遍欢迎. 也正是从 ES6 (ES2015) 开始,JavaScript 版本发布变为年更,即每年发布 ...
- Mongodb副本集+分片集群环境部署
前面详细介绍了mongodb的副本集和分片的原理,这里就不赘述了.下面记录Mongodb副本集+分片集群环境部署过程: MongoDB Sharding Cluster,需要三种角色: Shard S ...
- 【AS3 Coder】任务五:Flash 2D游戏的第二春(下)
在上一节中,我们基本上已经讲完了游戏中最主要的逻辑部分,不过为了更加全面地运用Starling中的一些特性,在本节中我们将一起来看看如何实现多面板切换以及粒子效果,这两个玩意儿可是比较频繁会出现于St ...
- 解決從Ubuntu 12.04升級至12.10之後的Unity顯示問題
FROM: http://blog.sina.com.cn/s/blog_97ef3ff4010190pe.html#bsh-75-306370781 今天中午經過系統自帶的“檢查更新”軟件從Ubun ...
- 通过脚本发送zabbix微信报警
实现zabbix通过微信报警的方式也是通过脚本来实现,与邮件报警不同的是,脚本调用的微信的相关接口的获取相对复杂一点 1.申请一个微信公众号(企业号) 申请方法不多说,如果已申请请忽略 2.在微信企业 ...
- 2017.4.19 慕课网-通过自动回复机器人学习mybatis
开发前的分析 1.技能前提 JSP JSTL EL JS/JQUERY Servlet JavaBean JDBC(后期再用mybatis,这样体会更深) MYSQL 2.需求分析和模块划分 (1)基 ...
- How to use Variables in different component
1. In Script Task component Set Value: Dts.Variables["ErrorMsg"].Value = string.Format(&qu ...