cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现
一、创建GameScene以及GameLayer
就是简单创建一个Scene而已,在此就不多说啦~,可以参照我的打飞机的学习笔记(2)。
二、添加一个开始栏
很简单,就是调用Block中的create方法就可以啦~,只是需要传入大小和颜色等等的参数即可。
void GameLayer::addStartLine()
{
auto block = Block::createWithArgs(Color3B::YELLOW, Size(visibleSize.width,visibleSize.height/), "Touch to start", , Color4B::BLACK); //调用方法。
this->addChild(block); //加入到场景中,如果没有设定Position的话,就是默认在Vec2::ZERO的位置
}
然后上图看效果、(记得在init中调用此方法).

三、加入一个结束栏
void GameLayer::addEndLine()
{
auto block = Block::createWithArgs(Color3B::GREEN, visibleSize, "Game Over", , Color4B::BLACK);
block->setBlockCol();
this->addChild(block); }
效果如下哈:

四、添加NormalLine以及实现初始化
(1)实现NormalLine的方法就是添加4个块,一个黑的,3白的。实现如下
void GameLayer::addNormalLine(int blockCol)//Col即行
{
int blackRow = CCRANDOM_0_1()*; //随机数,随机一个黑色的方块
for(int i=;i<;i++)
{
auto block = Block::createWithArgs(blackRow==i?Color3B::BLACK:Color3B::WHITE,
Size(visibleSize.width/-,visibleSize.height/-), "", , Color4B::BLACK);
block->setPosition(Vec2(i*visibleSize.width/,blockCol*visibleSize.height/));
block->setBlockCol(blockCol);//储存所在的行号
this->addChild(block);
}
}
(2)初始化界面
void GameLayer:: startGame()
{
this->addStartLine();
this->addNormalLine();
this->addNormalLine();
this->addNormalLine(); }
于是乎,我们没有WelcomeScene的别踩白块的开始界面就此OK!!

五、游戏触摸事件的实现。
游戏的交互很简单,就是点一下黑的就变灰,然后下移(这个放在GameLoop中),点下白的就拜拜。
实现如下:
(1)先继承Layer的触摸方法。
virtual bool onTouchBegan(Touch *touch, Event *unused_event);
这是一个单点的触摸方法。还有3个,我们这里用不到,就先不多说啦,然后这个方法,可以帮助我们实现触摸交互的功能。
然后我们还需要在init中,将此加入事件监听器。
auto touchListener = EventListenerTouchOneByOne::create(); //创建一个单点触控的方法
touchListener->onTouchBegan=CC_CALLBACK_2(GameLayer::onTouchBegan, this); //加入方法
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(touchListener,this);//设置优先级
(2)触摸方法的实现
bool GameLayer::onTouchBegan(Touch *touch, Event *unused_event)
{ auto bs = Block::getBlocks(); //取出那个存放Block的数组
Block *b; for(auto it = bs->begin(); it != bs->end(); it++)
{
b = *it; //it是数组的指针,而*it才是其中存放的内容,即Block类的指针 if( b->getBlockCol() == && b->getBoundingBox().containsPoint(touch->getLocation()) )
{
if(b->getColor()==Color3B::BLACK)
{ b->setColor(Color3B::GRAY); //变灰
break;
}else
{
MessageBox("GameOver","失败"); //失败,失败后可以要强制重新开始。。在此我就默默省了。
}
}
} return true;
}
效果图如下:

六、GameLoop的实现
(1)MoveDown的实现
void GameLayer::moveDown()
{
this->addNormalLine(); //新加入一栏 auto bs = Block::getBlocks();
for(auto it=bs->begin(); it!=bs->end(); it++)
{
(*it)->moveDown(); //所有的Block向下移动下。
}
}
(2)GameLoop的实现
如果仅仅实现(1)的话= =,那你玩到天荒地老都停不下来= =,所以我们要加一个限制,就是啥时候游戏结束。
要不就是手残点到白的的时候死翘翘,要不就是集满25个Block就可以……(你懂的)。
所以呢,我们需要加入一个计数变量_lineCount和是否结束的bool变量 _showEndLine,
1、定义初始化
在GameLayer.h定义一个int的变量,然后再那个初始化中初始化为0,_showEndline则初始化为false
2、然后在addNormalLine()方法计数++
3、然后在MoveDone中进行一个结束的判断。
if(_lineCount<)
{
this->addNormalLine();
} else if(!_showEndLine)
{
this-> addEndLine();
_showEndLine = true;
}
4、然后在触摸事件中,也要多一个判断,就是结束栏虽然点到,但是不会变成灰色的= =
if(b->getColor()==Color3B::BLACK)
{ b->setColor(Color3B::GRAY);
this->moveDown();break;
} else if(b->getColor()==Color3B::GREEN)
{
this->moveDown();
} else
{
MessageBox("GameOver","失败");
}
5、最后上图

七、计时间的加入。
(1)当然是要建立一个Label,嘻嘻,在头文件中定义:
Label *_timerLabel; long _startTime; //开始的时刻 bool _timeRunning; //是否在跑
(2)相关方法
void GameLayer::update(float dt) //继承的update方法,会自动一秒60次的更新画面
{
long offset = clock()-_startTime; //计算出时间 _timerLabel->setString(StringUtils::format("%g",((double)offset)/1000000)); //改变Label的值。
} void GameLayer::startTimer() //开始的时刻
{
if(!_timeRunning)
{
scheduleUpdate();
_startTime = clock();
_timeRunning = true;
}
} void GameLayer::stopTimer() //结束
{
if(_timeRunning)
{
unscheduleUpdate();
_timeRunning = false;
}
} void initTimeLabel() //初始化_timerLabel
{ _timerLabel = Label::create(); _timerLabel->setColor(Color3B::BLUE); _timerLabel->setSystemFontSize(50);
_timerLabel->setString("0.0000");
_timerLabel->setPosition(visibleSize.width / 2, visibleSize.height - 100);
this->addChild(_timerLabel,10)
}
然后上图。看效果。到此经典模式完成,其他模式,我会以后再分享,因为我也是看别人的学习的,我是个小白,只是把每次学习的通过写博客的方式强化印象,并且希望其他小白有个借鉴。毕竟只有开放,才能更快更好的进步。

cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现的更多相关文章
- cocos2dx游戏开发——别踩白块学习笔记(一)——Block类
一.Block类介绍 当然啦,Block类在这个游戏里就是必需品= =,因为整体都是由这个搞出来的,所以我们可以把游戏需要实现的功能都放在这里. 主要有下面这些功能(经典模式): 1.创建一个Bloc ...
- 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴
上一节学习了使用Cocos2d-x播放音乐的方法,但是那种方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗.按键音效等)则要通过playEffect来播放.本节使用该方法以及之前学 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音
<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...
- cocos2dx游戏开发——捕鱼达人mini版学习笔记(二)——MainMenu的搭建
一.创建文件~ MainMenuScene.h MainMenuScene.cpp MainMenuLayer.h MainMenuLayer.cpp 那个场景的搭建就不多说了,那个我的打 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记1--在Cocos2d中显示图像
Cocos2d-x中的图像是通过精灵类来显示的.在Cocos2d-x中游戏中的每一个角色.怪物.道具都可以理解成是一个精灵,游戏背景作为一种特殊的单位将其理解成是一个精灵也没有什么不妥.在源文件本章目 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记2--在Cocos2d-x中显示一行文字
在Cocos2d-x中要显示文字就需要用到Label控件.在3.x版本的Cocos2d中,舍弃了之前版本所使用的LabelTTF.LabelAtlas.LabelBMFont 3个用于显示文字的类,而 ...
- cocos2dx游戏开发——捕鱼达人mini版学习笔记(一)——FishAchor的搭建
一.创建文件· FishAchor.h还有FishAchor.cpp. 主要就是创建每种鱼的类,方便以后的取用~,很多是重复性的操作,然后我们是mini版,暂时也就加入大概6钟鱼就好= =,然后我们现 ...
- ios-高仿别踩白块游戏的实现
先看下效果图片 前几天看到一个游戏叫别踩白块,下载量还挺大几百万了都,下载下来玩了玩看了看,这个游戏还挺简单的.俗话说想一千遍,一万遍不如动手做一遍来的实在.昨晚以及今天白天闲的没事就开搞了,下午六点 ...
- jquery之别踩白块游戏的实现
转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5687112.html 前端学习要告一段落了,也没机会写什么像样的东西,然后无意中想起某人以前给我玩了一下别踩白块的游 ...
随机推荐
- 77 找出最大连续自然数个数[Longest Consecutive Sequence in an Unsorted Array]
[本文链接] http://www.cnblogs.com/hellogiser/p/Longest-Consecutive-Sequence-in-an-Unsorted-Array.html [题 ...
- ACM/ICPC 之 用双向链表 or 模拟栈 解“栈混洗”问题-火车调度(TSH OJ - Train)
本篇用双向链表和模拟栈混洗过程两种解答方式具体解答“栈混洗”的应用问题 有关栈混洗的定义和解释在此篇:手记-栈与队列相关 列车调度(Train) 描述 某列车调度站的铁道联接结构如Figure 1所示 ...
- iOS9 UI Tests探索笔记
UI Tests是什么? UI Tests是一个自动测试UI与交互的Testing组件 UI Tests有什么用? 它可以通过编写代码.或者是记录开发者的操作过程并代码化,来实现自动点击某个按钮.视图 ...
- java 500/404错误总结
404是路径错误,简单的说就是你的页面找不到后台执行它的代码(未找到服务端代码)500最常见的就是你的编程语言语法错误导致的(服务端代码报错)
- Qt Creator 中关于调试器的设置
Qt Creator3.4.2 Based on Qt 5.5.0 (MSVC 2013, 32 bit) 在安装了VS2013的电脑上能够自动识别VS编译器,却不能识别调试器 需要下载一个wdk,安 ...
- ASP.NET 下载文件并继续执行JS解决方法
需求说明:当用户点击按钮时使当前按钮为不可用,并打开新页面,关闭新页面时,按钮变为可用.并且如果不关闭新页面,当前按钮过10秒钟自动变为可用. 包含3个页面: 一.按钮页 前台代码:当刷新后采用js进 ...
- 奶牛健美操(codevs 3279)
题目描述 Description Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点 ...
- Mysql之高可用
使用缓存Memcache, 1,可使用Hash算法由客户端决定路由到哪个Memcache服务器上:客户端完全不用关心数据存储在哪个Memcache服务器上:完全隔离了客户端与服务端:由于是Hash,在 ...
- fork与vfork的区别与联系
fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1. fork ():子进程拷贝父进程的数据段,代码段 vfork ( ):子进程与父进程共享数据段 2. fo ...
- NYOJ题目770仿射密码
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAs4AAAIUCAIAAACFKz0yAAAgAElEQVR4nO3dPXLruLaG4TsJ5RqIYw