一、创建GameScene以及GameLayer

就是简单创建一个Scene而已,在此就不多说啦~,可以参照我的打飞机的学习笔记(2)。

二、添加一个开始栏

很简单,就是调用Block中的create方法就可以啦~,只是需要传入大小和颜色等等的参数即可。

  1. void GameLayer::addStartLine()
  2. {
  3. auto block = Block::createWithArgs(Color3B::YELLOW, Size(visibleSize.width,visibleSize.height/), "Touch to start", , Color4B::BLACK); //调用方法。
  4. this->addChild(block); //加入到场景中,如果没有设定Position的话,就是默认在Vec2::ZERO的位置
  5. }

然后上图看效果、(记得在init中调用此方法).

三、加入一个结束栏

  1. void GameLayer::addEndLine()
  2. {
  3. auto block = Block::createWithArgs(Color3B::GREEN, visibleSize, "Game Over", , Color4B::BLACK);
  4. block->setBlockCol();
  5. this->addChild(block);
  6.  
  7. }

效果如下哈:

四、添加NormalLine以及实现初始化

(1)实现NormalLine的方法就是添加4个块,一个黑的,3白的。实现如下

  1. void GameLayer::addNormalLine(int blockCol)//Col即行
  2. {
  3. int blackRow = CCRANDOM_0_1()*; //随机数,随机一个黑色的方块
  4. for(int i=;i<;i++)
  5. {
  6. auto block = Block::createWithArgs(blackRow==i?Color3B::BLACK:Color3B::WHITE,
  7. Size(visibleSize.width/-,visibleSize.height/-), "", , Color4B::BLACK);
  8. block->setPosition(Vec2(i*visibleSize.width/,blockCol*visibleSize.height/));
  9. block->setBlockCol(blockCol);//储存所在的行号
  10. this->addChild(block);
  11. }
  12. }

(2)初始化界面

  1. void GameLayer:: startGame()
  2. {
  3. this->addStartLine();
  4. this->addNormalLine();
  5. this->addNormalLine();
  6. this->addNormalLine();
  7.  
  8. }

于是乎,我们没有WelcomeScene的别踩白块的开始界面就此OK!!

五、游戏触摸事件的实现。

游戏的交互很简单,就是点一下黑的就变灰,然后下移(这个放在GameLoop中),点下白的就拜拜。

实现如下:

(1)先继承Layer的触摸方法。

virtual bool onTouchBegan(Touch *touch, Event *unused_event);

这是一个单点的触摸方法。还有3个,我们这里用不到,就先不多说啦,然后这个方法,可以帮助我们实现触摸交互的功能。

然后我们还需要在init中,将此加入事件监听器。

  1. auto touchListener = EventListenerTouchOneByOne::create(); //创建一个单点触控的方法
  2. touchListener->onTouchBegan=CC_CALLBACK_2(GameLayer::onTouchBegan, this); //加入方法
  3. Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(touchListener,this);//设置优先级

(2)触摸方法的实现

  1. bool GameLayer::onTouchBegan(Touch *touch, Event *unused_event)
  2. {
  3.  
  4. auto bs = Block::getBlocks(); //取出那个存放Block的数组
  5. Block *b;
  6.  
  7. for(auto it = bs->begin(); it != bs->end(); it++)
  8. {
  9. b = *it; //it是数组的指针,而*it才是其中存放的内容,即Block类的指针
  10.  
  11. if( b->getBlockCol() == && b->getBoundingBox().containsPoint(touch->getLocation()) )
  12. {
  13. if(b->getColor()==Color3B::BLACK)
  14. {
  15.  
  16. b->setColor(Color3B::GRAY); //变灰
  17. break;
  18. }else
  19. {
  20. MessageBox("GameOver","失败"); //失败,失败后可以要强制重新开始。。在此我就默默省了。
  21. }
  22. }
  23. }
  24.  
  25. return true;
  26. }

效果图如下:

                    

六、GameLoop的实现

(1)MoveDown的实现

  1. void GameLayer::moveDown()
  2. {
  3. this->addNormalLine(); //新加入一栏
  4.  
  5. auto bs = Block::getBlocks();
  6. for(auto it=bs->begin(); it!=bs->end(); it++)
  7. {
  8. (*it)->moveDown(); //所有的Block向下移动下。
  9. }
  10. }

(2)GameLoop的实现

如果仅仅实现(1)的话= =,那你玩到天荒地老都停不下来= =,所以我们要加一个限制,就是啥时候游戏结束。

要不就是手残点到白的的时候死翘翘,要不就是集满25个Block就可以……(你懂的)。

所以呢,我们需要加入一个计数变量_lineCount和是否结束的bool变量 _showEndLine,

1、定义初始化

在GameLayer.h定义一个int的变量,然后再那个初始化中初始化为0,_showEndline则初始化为false

2、然后在addNormalLine()方法计数++

3、然后在MoveDone中进行一个结束的判断。

  1. if(_lineCount<)
  2. {
  3. this->addNormalLine();
  4. }
  5.  
  6. else if(!_showEndLine)
  7. {
  8. this-> addEndLine();
  9. _showEndLine = true;
  10. }

4、然后在触摸事件中,也要多一个判断,就是结束栏虽然点到,但是不会变成灰色的= =

  1. if(b->getColor()==Color3B::BLACK)
  2. {
  3.  
  4. b->setColor(Color3B::GRAY);
  5. this->moveDown();break;
  6. }
  7.  
  8. else if(b->getColor()==Color3B::GREEN)
  9. {
  10. this->moveDown();
  11. }
  12.  
  13. else
  14. {
  15. MessageBox("GameOver","失败");
  16. }

5、最后上图

七、计时间的加入。

(1)当然是要建立一个Label,嘻嘻,在头文件中定义:

  1. Label *_timerLabel;
  2.  
  3. long _startTime; //开始的时刻
  4.  
  5. bool _timeRunning; //是否在跑

(2)相关方法

  1. void GameLayer::update(float dt) //继承的update方法,会自动一秒60次的更新画面
  2. {
  3. long offset = clock()-_startTime; //计算出时间
  4.  
  5. _timerLabel->setString(StringUtils::format("%g",((double)offset)/1000000)); //改变Label的值。
  6. }
  7.  
  8. void GameLayer::startTimer() //开始的时刻
  9. {
  10. if(!_timeRunning)
  11. {
  12. scheduleUpdate();
  13. _startTime = clock();
  14. _timeRunning = true;
  15. }
  16. }
  17.  
  18. void GameLayer::stopTimer() //结束
  19. {
  20. if(_timeRunning)
  21. {
  22. unscheduleUpdate();
  23. _timeRunning = false;
  24. }
  25. }
  26.  
  27. void initTimeLabel() //初始化_timerLabel
    {
  28.  
  29. _timerLabel = Label::create();
  30.  
  31. _timerLabel->setColor(Color3B::BLUE);
  32.  
  33. _timerLabel->setSystemFontSize(50);
  1. _timerLabel->setString("0.0000");
  2. _timerLabel->setPosition(visibleSize.width / 2, visibleSize.height - 100);
  3. this->addChild(_timerLabel,10)
  1. }

然后上图。看效果。到此经典模式完成,其他模式,我会以后再分享,因为我也是看别人的学习的,我是个小白,只是把每次学习的通过写博客的方式强化印象,并且希望其他小白有个借鉴。毕竟只有开放,才能更快更好的进步。

cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现的更多相关文章

  1. cocos2dx游戏开发——别踩白块学习笔记(一)——Block类

    一.Block类介绍 当然啦,Block类在这个游戏里就是必需品= =,因为整体都是由这个搞出来的,所以我们可以把游戏需要实现的功能都放在这里. 主要有下面这些功能(经典模式): 1.创建一个Bloc ...

  2. 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴

    上一节学习了使用Cocos2d-x播放音乐的方法,但是那种方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗.按键音效等)则要通过playEffect来播放.本节使用该方法以及之前学 ...

  3. 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

    <Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...

  4. cocos2dx游戏开发——捕鱼达人mini版学习笔记(二)——MainMenu的搭建

    一.创建文件~ MainMenuScene.h   MainMenuScene.cpp   MainMenuLayer.h   MainMenuLayer.cpp 那个场景的搭建就不多说了,那个我的打 ...

  5. 《Cocos2d-x游戏开发实战精解》学习笔记1--在Cocos2d中显示图像

    Cocos2d-x中的图像是通过精灵类来显示的.在Cocos2d-x中游戏中的每一个角色.怪物.道具都可以理解成是一个精灵,游戏背景作为一种特殊的单位将其理解成是一个精灵也没有什么不妥.在源文件本章目 ...

  6. 《Cocos2d-x游戏开发实战精解》学习笔记2--在Cocos2d-x中显示一行文字

    在Cocos2d-x中要显示文字就需要用到Label控件.在3.x版本的Cocos2d中,舍弃了之前版本所使用的LabelTTF.LabelAtlas.LabelBMFont 3个用于显示文字的类,而 ...

  7. cocos2dx游戏开发——捕鱼达人mini版学习笔记(一)——FishAchor的搭建

    一.创建文件· FishAchor.h还有FishAchor.cpp. 主要就是创建每种鱼的类,方便以后的取用~,很多是重复性的操作,然后我们是mini版,暂时也就加入大概6钟鱼就好= =,然后我们现 ...

  8. ios-高仿别踩白块游戏的实现

    先看下效果图片 前几天看到一个游戏叫别踩白块,下载量还挺大几百万了都,下载下来玩了玩看了看,这个游戏还挺简单的.俗话说想一千遍,一万遍不如动手做一遍来的实在.昨晚以及今天白天闲的没事就开搞了,下午六点 ...

  9. jquery之别踩白块游戏的实现

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5687112.html 前端学习要告一段落了,也没机会写什么像样的东西,然后无意中想起某人以前给我玩了一下别踩白块的游 ...

随机推荐

  1. php如何妩媚地生成执行的sql语句

    会不会碰到这样一种情况呢?每次获取数据将数据和历史版本都有一定的差别,然而用ThinkPHP的addAll()函数,却会将已有的数据删掉再重新写入.这明显不是我们想要的.但自己写sql每次几十个字段也 ...

  2. ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

    //转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring ...

  3. vps mysql自动关闭

    买了个阿里云的vps 装了一个wordpress,mysql一直自动关闭,百思不得其解,只有搜索 最后才发现是因为服务器内存太小,毕竟是最便宜的才512m ---------------------- ...

  4. 【leetcode】Candy(hard) 自己做出来了 但别人的更好

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  5. 20145213《Java程序设计》第三周学习总结

    20145213<Java程序设计>第三周学习总结 教材学习内容总结 正所谓距离产生美,上周我还倾心于Java表面的基础语法.其简单的流程结构,屈指可数的基本类型分类,早已烂熟于心的运算符 ...

  6. 【Excel 4.0 函数】REGISTER 的两种形式以及VBA等效语句

    形式1 REGISTER("SAMPLE.DLL", "MyFunction", "AIC") 形式1等效 VBA语句 Declare Fu ...

  7. ajax鼠标滚动请求 或 手机往下拉请求

    Zepto(function($){ var url = $('.page-url').val(); var cur = false; var href_url = $('.page-url').at ...

  8. python基础——实例属性和类属性

    python基础——实例属性和类属性 由于Python是动态语言,根据类创建的实例可以任意绑定属性. 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Student(objec ...

  9. NYOJ题目611练练

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAssAAAJ1CAIAAACgqiqJAAAgAElEQVR4nO3du27jSp4HYL+Ecj2IYz

  10. php PDO:数据访问抽象层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...