说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x
2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记

这一步基本思路也是借鉴了前辈重写的泰然教程,金币和岩石抽象出一个基类,可是总的细节设计和前辈的非常大的不同,后面写完,我认为事实上Runner也能够继承自那个基类,只是因为自己还有其它事。就没去尝试啦。

那么这里我是这样设计的:基类Base ,主要就是 setSprite,和 getSprite,以及getConSize--这个主要是为了后面金币和岩石的物理刚体绑定,那么金币Coin里面就 initBody--初始物理刚体。createAnimate--创建金币的旋转动画。Rock里面就是一个initBody。。

当时因为这里是自己设计的。想得比較乱,然后发现,事实上initBody 也能够抽象在基类里面。这里就没有改了。

然后,有了Coin 和 Rock,它们的出现,隐藏。以及位置放置,我们就用一个BaseManager来完毕,那么这里我是学习了 笨木头的方法: 为了反复的 create 金币,每次金币走出屏幕外。或者被主角吃了,我们就让它不可见,然后在BaseManager里面用一个update函数。对于不可见的金币我们让它重现江湖。。

OK上马:Base.h  & Base.cpp

  1. #ifndef __Base__H__
  2. #define __Base__H__
  3. #include "cocos2d.h"
  4. class Base : public cocos2d::Node{
  5. public:
  6. Base();
  7. void setSprite(cocos2d::Sprite* sprite);
  8. cocos2d::Sprite* getSprite();
  9. cocos2d::Size getConSize();
  10. private:
  11. cocos2d::Sprite* m_sprite;
  12. };/**/
  13. #endif
[html] view
plain
copy

  1. #include "Base.h"
  2. USING_NS_CC;
  3. Base::Base(){
  4. m_sprite = NULL;
  5. }
  6. void Base::setSprite(Sprite* sprite){
  7. m_sprite = sprite;
  8. //要加入到子节点中 ,才干被显示出来
  9. this->addChild(m_sprite);
  10. }
  11. Sprite* Base::getSprite(){
  12. return m_sprite;
  13. }
  14. Size Base::getConSize(){
  15. return m_sprite->getContentSize();
  16. }

金币 Coin.h & .cpp

  1. #ifndef __Coin__H__
  2. #define __Coin__H__
  3. #include "Base.h"
  4. class Coin : public Base{
  5. public:
  6. virtual bool init();
  7. CREATE_FUNC(Coin);
  8. //金币动作
  9. cocos2d::Animate* createAnimate(cocos2d::SpriteFrameCache* frameCache);
  10. //物理刚体
  11. void initBody();
  12. private:
  13. };/**/
  14. #endif
  15. ------------------------.cpp---------------------------------
  16. #include "Coin.h"
  17. USING_NS_CC;
  18. bool Coin::init(){
  19. if(!Node::init()){
  20. return false;
  21. }
  22. //缓存池
  23. auto frameCache = SpriteFrameCache::getInstance();
  24. frameCache->addSpriteFramesWithFile("parkour.plist","parkour.png");
  25. auto sprite = Sprite::createWithSpriteFrameName("coin0.png");
  26. //绑定
  27. setSprite(sprite);
  28. //运行动作
  29. getSprite()->runAction(createAnimate(frameCache));
  30. //绑定刚体
  31. initBody();
  32. return true;
  33. }
  34. Animate* Coin::createAnimate(SpriteFrameCache* frameCache){
  35. SpriteFrame* frame = NULL;
  36. //数组不行 要用vector
  37. //auto frameArray = Array::create();
  38. //frameArray->retain();
  39. Vector<SpriteFrame*>frameArray;
  40. // 用一个列表保存全部SpriteFrame对象
  41. for(int i = 0; i <= 7; i++) {
  42. /* 从SpriteFrame缓存池中获取CCSpriteFrame对象 */
  43. frame = frameCache->spriteFrameByName(String::createWithFormat("coin%d.png", i)->getCString());
  44. frameArray.pushBack(frame);
  45. }
  46. /* 使用SpriteFrame列表创建动画对象 */
  47. auto animation = Animation::createWithSpriteFrames(frameArray);
  48. animation->setLoops(-1);
  49. animation->setDelayPerUnit(0.1f);
  50. /* 将动画包装成一个动作 */
  51. auto action = Animate::create(animation);
  52. return action;
  53. }
  54. void Coin::initBody(){
  55. auto phyBody = PhysicsBody::createEdgeBox(getSprite()->getContentSize());
  56. phyBody->setCategoryBitmask(1);
  57. phyBody->setCollisionBitmask(1);
  58. phyBody->setContactTestBitmask(1);
  59. this->setPhysicsBody(phyBody);
  60. }

岩石Rock.h & .cpp

  1. <span style="font-size:14px;">#ifndef __Rock__H__
  2. #define __Rock__H__
  3. #include "Base.h"
  4. #include "cocos2d.h"
  5. class Rock : public Base{
  6. public:
  7. virtual bool init();
  8. CREATE_FUNC(Rock);
  9. void initBody();
  10. };/**/
  11. #endif
  12. -------------------------------------------
  13. #include "Rock.h"
  14. USING_NS_CC;
  15. bool Rock::init(){
  16. if(!Node::init()){
  17. return false;
  18. }
  19. auto frameCache = SpriteFrameCache::getInstance();
  20. frameCache->addSpriteFramesWithFile("parkour.plist","parkour.png");
  21. auto sprite = Sprite::createWithSpriteFrameName("rock.png");
  22. setSprite(sprite);
  23. initBody();
  24. return true;
  25. }
  26. void Rock::initBody(){
  27. auto phyBody = PhysicsBody::createEdgeBox(getSprite()->getContentSize());
  28. phyBody->setCategoryBitmask(1);
  29. phyBody->setCollisionBitmask(1);
  30. phyBody->setContactTestBitmask(1);
  31. this->setPhysicsBody(phyBody);
  32. }</span><span style="font-size:18px;">
  33. </span>

那么这里主要重点看 管理类BaseManager.h & .cpp

  1. #ifndef __BaseManager__H__
  2. #define __BaseManager__H__
  3. #include "cocos2d.h"
  4. #include "Coin.h"
  5. #include "Rock.h"
  6. #define coinNum 4
  7. #define coinTag 2  //这里关于Tag 用于后面的碰撞检測
  8. #define rockNum 2
  9. #define rockTag 3
  10. class BaseManager : public cocos2d::Node{
  11. public:
  12. CREATE_FUNC(BaseManager);
  13. virtual bool init();
  14. virtual void update(float dt);
  15. private:
  16. void createCoin();
  17. cocos2d::Array* m_coinArr;
  18. void createRock();
  19. cocos2d::Array* m_rockArr;
  20. };/**/
  21. #endif
  22. --------------------------------------------------------
  23. #include "BaseManager.h"
  24. #define ground_hight 59
  25. USING_NS_CC;
  26. bool BaseManager::init(){
  27. if(!Node::init()){
  28. return false;
  29. }
  30. createCoin();
  31. createRock();
  32. this->scheduleUpdate();
  33. return true;
  34. }
  35. void BaseManager::createCoin(){
  36. m_coinArr = Array::create();
  37. m_coinArr->retain();
  38. Coin* coin = NULL;
  39. for(int i = 1; i <= coinNum; ++ i){
  40. coin = Coin::create();
  41. coin->setVisible(false);
  42. coin->setTag(coinTag);
  43. //记得加入
  44. this->addChild(coin);
  45. m_coinArr->addObject(coin);
  46. }/**/
  47. }
  48. void BaseManager::createRock(){
  49. m_rockArr = Array::create();
  50. m_rockArr->retain();
  51. Rock* rock = NULL;
  52. float dis = 960;//两岩石的间距
  53. for(int i = 1; i <= rockNum; ++ i){
  54. rock = Rock::create();
  55. rock->setTag(rockTag);
  56. rock->setPosition(dis,ground_hight+rock->getConSize().height/2);
  57. dis += 640;
  58. //记得加入
  59. this->addChild(rock);
  60. m_rockArr->addObject(rock);
  61. }/**/
  62. }
  63. void BaseManager::update(float dt){
  64. Ref* obj = NULL;
  65. Coin* coin = NULL;
  66. //须要重置金币的个数
  67. int setNum = 0;
  68. CCARRAY_FOREACH(m_coinArr,obj){
  69. coin = (Coin*)obj;
  70. //不在屏幕
  71. if(coin->getPositionX() < -coin->getConSize().width/2){
  72. coin->setVisible(false);
  73. }
  74. //要是不可见,要不就是不在屏幕里,要不就是被碰撞了
  75. if( !coin->isVisible() ){
  76. setNum ++;
  77. }
  78. //让金币移动
  79. coin->setPositionX(coin->getPositionX()-2);
  80. }
  81. //4个所有重置
  82. if(setNum == 4){
  83. int i = 0;
  84. float posX = 640+50;
  85. float posY = ground_hight + 15 + CCRANDOM_0_1()*60;
  86. CCARRAY_FOREACH(m_coinArr,obj){
  87. coin = (Coin*)obj;
  88. //不在屏幕
  89. if(coin->getPositionX() < -coin->getConSize().width/2){
  90. coin->setVisible(false);
  91. }
  92. //要是不可见。要不就是不在屏幕里。要不就是被碰撞了
  93. if( !coin->isVisible() ){
  94. //两个两个一起
  95. if(i < 2){
  96. posX += 30;//两个金币同一高度,间隔30
  97. }else{
  98. //又一次重置位置
  99. i = -1;
  100. posY = ground_hight + 15 + CCRANDOM_0_1()*60;
  101. posX += 400;
  102. }
  103. i ++;//重置金币个数记录
  104. //
  105. coin->setVisible(true);
  106. coin->setPosition(posX,posY);
  107. }
  108. }
  109. }
  110. Ref* rockObj = NULL;
  111. Rock* rock = NULL;
  112. CCARRAY_FOREACH(m_rockArr,rockObj){
  113. rock = (Rock*)rockObj;
  114. if(rock->getPositionX() < -rock->getConSize().width/2){
  115. rock->setVisible(false);
  116. }
  117. if(rock->isVisible() == false){
  118. float posX = 1280;
  119. float posY = ground_hight + rock->getConSize().height/2;
  120. if(CCRANDOM_MINUS1_1() > 0){
  121. posY += 50;
  122. }
  123. rock->setPosition(posX,posY);
  124. rock->setVisible(true);
  125. }
  126. rock->setPositionX(rock->getPositionX()-2);
  127. }
  128. }

代码中,我们主要看看 两个Create 函数,以及update函数。

createCoin :我们先确定整个过程仅仅有4个金币,而且一開始都设置为 不可见,那么在update 函数中,我们对全部的金币遍历,假设是不可见,那么我们就让它可见,而且两个一起 间隔30 ,同一高度放置,然后 高度不一致。可能出现地面,可能须要主角跳起来才可以到,而createRock。我们整个屏幕就放两个就够了。这两个也有两个位置,一个在地面。一个在空中须要主角crouch或者Jump也可以。。。事实上这里的位置放置算法(应该算是有点算法的味道吧)
写得非常乱,这里就所有是我自己设计的。。

。感觉金币岩石出现的非常没有 美观。

只是也还算是能够执行。

。。。。

那么我们能够測试一下。在PlayScene中加入成员

BaseManager* m_manager;

然后在init函数中 create 增加 this的addChild中

可是这里的话,我们建议把 Coin & Rock 两个类里面的 init 函数中的 initBody 先凝视掉,然后再測试。不然带着刚体,主角跑起来非常不顺利。測试例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWllZMTczNTMzODMy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" style="border:none; max-width:100%">

以下就要来利用物理碰撞检測了---全部的也就快结束啦

个人愚昧观点,欢迎指正与讨论

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第六步--金币&amp;岩石加入而且管理的更多相关文章

  1. cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  2. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第一步--- 开始界面

    说明:这里是平局:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  3. cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&amp;同一时候带着刚体

    说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  4. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  5. cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--button控制主角Jump&amp;Crouch

    说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  6. cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机

    说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  7. coco2d-x 3.0游戏实例学习笔记 《跑酷》 第二步---游戏界面&amp;全新的3.0物理世界

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写.并做相关笔记 ...

  8. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&amp;主角加入动作

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  9. cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第二步---编辑器(1)--触摸加入点

    /* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...

随机推荐

  1. 原生JS---1

    js的历史 在上个世纪的1995年,当时的网景公司正凭借其Navigator浏览器成为Web时代开启时最著名的第一代互联网公司. 由于网景公司希望能在静态HTML页面上添加一些动态效果,于是叫Bren ...

  2. Python 40 数据库-约束

    约束 1.什么是约束 ? 除了数据类型以外额外添加的约束 2.为什么要使用约束 ? 为了保证数据的合法性 完整性 分类: 1.not null 非空约束,数据不能为空----------------- ...

  3. POJ 1111(数字很吉利嘛) 简单BFS

    Image Perimeters Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8594 Accepted: 5145 Desc ...

  4. 最简单的多线程死锁案例代码(Java语言)

    package com.thread.test; public class DeadLock { private static Object firstMonitor = new Object(); ...

  5. Java冒泡,快速,插入,选择排序^_^+二分算法查找

    这段时间在学Java,期间学到了一些排序和查找方法.特此写来和大家交流,也方便自己的日后查看与复习. 1.下边是Java的主类: public class Get { public static vo ...

  6. EnforceLearning-主动强化学习

    前言: 被动学习Agent由固定的策略决定其行为.主动学习Agent必须自己决定采取什么行动. 具体方法是: Agent将要学习一个包含所有行动结果概率的完整模型,而不仅仅是固定策略的模型: 接下来, ...

  7. 本博客基本不再更新,请移步至我的CSDN博客

    本博客基本不再更新,请移步至我的CSDN博客:http://blog.csdn.net/wpxu08

  8. 排序算法Java版

    选择排序: public static void selectSort(int[]a) { int minIndex=0; int temp=0; if((a==null)||(a.length==0 ...

  9. javaee Properties键值对写入和读取方法

    package Zjshuchu; import java.util.Properties; import java.util.Set; public class Demo03 { public st ...

  10. Python 文件操作 day2

    一.打开文件的模式1:读.写.追加 1.r读:读模式,只能读,不能写,打开不存在的文件会报错:可省略'r',因为不写默认是读模式 f = open('filename',encoding='utf-8 ...