欢迎转载http://blog.csdn.net/demon_wu/article/details/9919115

最近公司的项目一直没有开工,所以自己给自己点事情做,写了一个简易的泡泡龙游戏。实习三个月接触cocos2d-x,实习完后换了家公司,一个月都还没有开工,实在是无奈呀。

想必很多人都玩过泡泡龙游戏了,本人用了一个下午做基本的界面实现,然后用一个上午开始处理逻辑,也就是泡泡射出过后的相关操作,准备按照这个节奏写,分为两章,开发平台是xcode,先上一个最后结果图。

图中可以看到有掉落的泡泡和正在消失的泡泡以及基础的界面,对于整体我采取的是用了一个负责泡泡的类和一个负责界面的类。泡泡我们需要考虑好它需要额外添加哪些属性,我继承了CCSprite然后添加了私有成员变量:_type、isSame、_isPass和_flag,_type表示的是该泡泡是什么类型的,用于显示泡泡的颜色以及做判断;_isSame是在后面运算的时候需要用来判断是否是与目标是相同颜色,如果是的话做标记,方便我们做判断,_isPass表示是否是有连接的,当没有连接的时候将会是被掉落的情况,_flag是表示当前是否是最靠左,在图中我们可以看到第一行中第一个是最靠左,但是第二行第一个不是最靠左,代码如下。

#ifndef __paopaolong__PaoPao__
#define __paopaolong__PaoPao__#include "cocos2d.h"
#include "GameEnum.h"
USING_NS_CC;
//泡泡类,包含类型和自己所在的一行是否是左缺的状态
class PaoPao : public CCSprite
{
public:PaoPao();~PaoPao();static PaoPao *initWithType(PAOPAO_TYPE type);CREATE_FUNC(PaoPao);CC_SYNTHESIZE(PAOPAO_TYPE, _type, Type);//泡泡的类型CC_SYNTHESIZE(bool, _isSame,IsSame); //判断是否是统一类型的CC_SYNTHESIZE(bool, _isPass, IsPass); //判断是否路过CC_SYNTHESIZE(bool, _flag, Flag);//是否是左缺的状态
private:static CCString * getStringByType(PAOPAO_TYPE type);
};#endif /* defined(__paopaolong__PaoPao__) */

其中用到了自定义的枚举类型PAOPAO_TYPE在GameEnum.h里面,GameEnum.h里面代码如下:

#ifndef paopaolong_GameEnum_h
#define paopaolong_GameEnum_henum PAOPAO_TYPE{PAOPAO_TYPE_UNKNOW,PAOPAO_TYPE1,PAOPAO_TYPE2,PAOPAO_TYPE3,PAOPAO_TYPE4,PAOPAO_TYPE5,PAOPAO_TYPE6,PAOPAO_TYPE7,PAOPAO_TYPE8,
};#endif

PaoPao类的实现代码如下。

#include "PaoPao.h"PaoPao::PaoPao()//构造函数初始化
{_flag = false;_type = PAOPAO_TYPE_UNKNOW;_isSame = false;_isPass = false;
}PaoPao::~PaoPao()
{}PaoPao * PaoPao::initWithType(PAOPAO_TYPE type) //根据传过来的类型来生成泡泡
{PaoPao *pRet = PaoPao::create();if (pRet && pRet->initWithFile(getStringByType(type)->getCString())) //初始化判断{pRet->setType(type); //初始化成功后,将_type修改成当前的type}else{CC_SAFE_RELEASE(pRet);pRet = NULL;}return pRet;
}CCString * PaoPao::getStringByType(PAOPAO_TYPE type) //不同类型获取不同的图片资源
{CCString *pRet = NULL;switch (type) {case PAOPAO_TYPE1:case PAOPAO_TYPE2:case PAOPAO_TYPE3:case PAOPAO_TYPE4:case PAOPAO_TYPE5:case PAOPAO_TYPE6:case PAOPAO_TYPE7:{pRet = CCString::createWithFormat("%d.png", static_cast<int>(type));}break;default:break;}return pRet;
}

现在这些只是实现了泡泡的基础,我们可以通过调用initWithType静态函数来得到想要的泡泡,接下来将会写主要的scene了,我的逻辑判断最后也是在scene里面写的,还没有很好的学会用MVC框架,所以代码质量不是很好,见谅下。

对于泡泡龙游戏来说主要的就是上面显示的泡泡,并且要错开的放置就会用到PaoPao类里面的_flag,在下面就是需要显示即将被使用到的泡泡和一个正在等待发射的泡泡,我采用了一个二维数组存放上面的泡泡,一个数组存放即将被使用的泡泡和一个变量存放等待发射的泡泡。对于在上方的泡泡来说我们需要知道他们每个泡泡的位置,也就是说我们可以通过行列和_flag来计算出它现在的position,MainLayer.h的代码如下。

#ifndef __paopaolong__MainLayer__
#define __paopaolong__MainLayer__#include "cocos2d.h"
#include "PaoPao.h"
#include "GameConst.h"
USING_NS_CC;class MainLayer : public CCLayer
{
public:// Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)virtual bool init();// there's no 'id' in cpp, so we recommend to return the class instance pointerstatic cocos2d::CCScene* scene();bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);// preprocessor macro for "static create()" constructor ( node() deprecated )CREATE_FUNC(MainLayer);virtual void update(float fDelta);
private:PaoPao *board[MAX_ROWS][MAX_COLS]; //棋盘PaoPao *wait[MAX_WAIT_PAOPAO]; //三个泡泡给用户看PaoPao *ready; //准备好一个泡泡准备发射CCPoint real; //泡泡移动的比例//初始化状态bool initTheBoard();//随机产生一个泡泡PaoPao *randomPaoPao();//通过行列获取位置CCPoint getPointByRowAndCol(int row, int col, bool flag);//初始化等待的泡泡void initWaitPaoPao();//初始化准备发射的泡泡void initReadyPaoPao();//触屏启动void setEnable();//触屏失效void setDisable();//检验发射泡泡是否碰撞到边界bool isCollideBorder();
};#endif /* defined(__paopaolong__MainLayer__) */

其中有很多使用到了宏定义,宏定义是为了方便修改,因为很多数据重复使用,为了修改统一所以使用宏定义较好,宏定义是在GameConst.h里面的,GameConst.h里面代码如下:

#ifndef paopaolong_GameConst_h
#define paopaolong_GameConst_h#define MAX_COLS 10
#define MAX_ROWS 20#define MAX_WAIT_PAOPAO 4#define READY_PAOPAO_POS ccp(320, 75)#define PAOPAO_SPEED 30.0#endif

现在就是MainLayer.cpp了,现在只是为了:一、初始化出所有的数据;二、能够通过点击发射出去泡泡;三、泡泡发射的同时能通过墙壁反射。先上代码:

#include "MainLayer.h"
CCScene* MainLayer::scene()
{// 'scene' is an autorelease objectCCScene *scene = CCScene::create();// 'layer' is an autorelease objectMainLayer *layer = MainLayer::create();// add layer as a child to scenescene->addChild(layer);// return the scenereturn scene;
}// on "init" you need to initialize your instance
bool MainLayer::init()
{//// 1. super init firstif ( !CCLayer::init() ){return false;}srand(time(NULL));// 设置背景CCSprite *background = CCSprite::create("back.png");background->setAnchorPoint(CCPointZero);background->setPosition(CCPointZero);this->addChild(background);initTheBoard();//创建两组泡泡,一组为给用户看的,一个是准备发射的initWaitPaoPao();initReadyPaoPao();this->setEnable();return true;
}//初始化上方的泡泡数组
bool MainLayer::initTheBoard()
{bool bRet = false;//初始化为空for (int i = 0; i < MAX_ROWS; ++ i){for (int j = 0; j < MAX_COLS; ++ j){board[i][j] = NULL;}}//假定初始化三行for (int i = 0; i < 3; ++ i){for (int j = 0; j < MAX_COLS; ++ j){PaoPao * obj = randomPaoPao();obj->setFlag(i % 2 == 0);obj->setPosition(getPointByRowAndCol(i, j, obj->getFlag()));this->addChild(obj);board[i][j] = obj;}}return bRet;
}//随机产生一个泡泡
PaoPao * MainLayer::randomPaoPao()
{PaoPao *pRet = NULL;PAOPAO_TYPE type = static_cast<PAOPAO_TYPE>(rand() % 7 + 1);pRet = PaoPao::initWithType(type);return pRet;
}//通过行列获取位置
CCPoint MainLayer::getPointByRowAndCol(int row, int col, bool flag)
{CCSize winSize = CCDirector::sharedDirector()->getWinSize();CCPoint pos = ccp(col * 60 + 30 + (flag ? 0 : 30), winSize.height - row * 60 - 30);return pos;
}
//初始化等待被使用的泡泡
void MainLayer::initWaitPaoPao()
{for(int i = 0; i < MAX_WAIT_PAOPAO; ++ i){PaoPao *obj = randomPaoPao();obj->setPosition(ccp(400 + i * 60, 30));wait[i] = obj;this->addChild(obj);}
}
//初始化正在被使用的泡泡
void MainLayer::initReadyPaoPao()
{ready = randomPaoPao();ready->setPosition(READY_PAOPAO_POS);this->addChild(ready);
}bool MainLayer::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{return true;
}
void MainLayer::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{CCPoint pos = pTouch->getLocation(); //获取当前点击的位置this->real = ccpNormalize(ccpSub(pos, ready->getPosition())); //将发射的距离进行换算,为了方便每次update的移动setDisable(); //设置触屏失效this->scheduleUpdate();//启动update定时任务
}void MainLayer::setEnable()//设置触屏可以使用
{CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);
}void MainLayer::setDisable()//设置触屏失效
{CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
}void MainLayer::update(float fDelta) //update函数
{if (isCollideBorder()) //先判断是否碰撞{real.x = -real.x; //如果碰撞就需要反方向移动}CCPoint pos = ready->getPosition(); //获取当前发射的泡泡的位置ready->setPosition(ccp(pos.x + real.x * PAOPAO_SPEED, pos.y + real.y * PAOPAO_SPEED)); //设置泡泡的位置
}//判断是否碰撞到墙壁了
bool MainLayer::isCollideBorder()
{bool bRet = false;CCSize size = CCDirector::sharedDirector()->getWinSize();CCPoint pos = ready->getPosition();CCSize content = ready->getContentSize();if(pos.x + content.width / 2 > size.width || pos.x - content.width / 2 < 0){bRet = true;}return bRet;
}

我先假设初始化三个行,其中泡泡都是通过randomPaoPao函数,发射之前是响应触屏的,在发射完后就是每次update里面移动位置,当发现碰撞后就直接反方向运动,其中用到了ccpNormalize,这是直接把两个坐标点的位置经过换算成一个直角三角形的直角两条边那种。

其中x * x + y * y = 1。

源码地址,VS版源码源码是完整的。

欢迎大家光临,再过段时间去写第二章,也是重点的泡泡的位置如何停,以及判断哪些泡泡是需要消除的,哪些泡泡是需要掉落的。

基于cocos2d-x简易泡泡龙游戏相关推荐

  1. 基于cocos2d-x简易泡泡龙游戏二

    欢迎大家转载http://blog.csdn.net/demon_wu/article/details/9925663 上一章节是一个下午的功劳,做了基础的界面和发射的功能,发射完了我们需要停止,停止 ...

  2. 基于控制台的五子棋小游戏(简易)

    基于控制台的五子棋小游戏(简易) 展示 源码: 使用: GoBang类: 展示 话不多说上代码 Don't talk much, say the code! 源码: 使用: new完直接运行 publ ...

  3. 基于Python pygame简易版斗兽棋小游戏源代码

    基于Python pygame简易版斗兽棋小游戏源代码 游戏规则如下: 胜利条件: 1.吃掉对方全部棋子 2.走入对方兽穴(不可进入自己洞穴) 吃法: 1.象>狮>虎>豹>狼& ...

  4. unity塔防游戏开发之基于标点法来简易实现敌人路线移动

    unity塔防游戏开发之基于标点法来简易实现敌人路线移动 首先创建一个物体,把它设置为静态物体,给他创建一系列子物体,将这些子物体放在各个路线的转角处,这样就实现标点的目的,然后将这些路标的位置都设置 ...

  5. unity 编辑器存档_Unity教程 | 自制简易的游戏存档系统

    原标题:Unity教程 | 自制简易的游戏存档系统 本文将为大家分享如何在Unity中实现简单的游戏存档系统,其中不会包含太多实际的代码,仅介绍在制作过程中需要考虑与解决的问题.该系统由一个学生团队为 ...

  6. 简单计算器的设计java_(基于java的简易计算器的设计.doc

    (基于java的简易计算器的设计 基于java的简易计算器的设计 摘要 自从java语言诞生以来,java语言就以不可抵挡的趋势很快成为国际上广泛流行的面向对象编程语言,它既具有高级语言的特点,又少了 ...

  7. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第51讲:PHP中smarty模板技术介绍

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第51讲:PHP中smarty模板技术介绍 smarty模板技术PHP程序设计中必须掌握的知识,本文结合贵阳网站建设中的案例介绍了基于smarty技术的员工列 ...

  8. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第37讲:HTTP协议请求(响应)

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第37讲:HTTP协议请求(响应) 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.h ...

  9. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第46讲:PHP程序设计中的session应用实例

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第46讲:PHP程序设计中的session应用实例 Session是服务器端技术, 可以把各自的数据放在各自的session中.本文实现了用Session实现 ...

最新文章

  1. vivo 互联网业务就近路由技术实战
  2. 大学生计算机基础excel视频,大学生计算机基础Excel.doc
  3. 进阶之初探nodeJS
  4. linux shell Bad substitution
  5. C#部分---函数添加基本格式;
  6. VMware-workstation-6.0 安装系统前必须映射光驱盘符
  7. Quartz框架中的Trigger
  8. T-SQL: Adding More to Our Queries
  9. vue 根据接口数据筛选_如何根据行值变化筛选数据
  10. 有意思的签到题集合~~
  11. lesson 040 —— 面向对象简介
  12. CarMaker入门——【第1讲】运行TestRuns示例
  13. axios封装简单有效
  14. 电机正反转c语言注释,直流电机正反转C程序.doc
  15. Oracle安装之后电脑变慢
  16. 台风怎么看内存颗粒_入手三星Bdie颗粒内存条,只超到了3866MHz,看样子得换主板了...
  17. canvas 实现图片局部模糊_HTML5 Canvas图片马赛克模糊动画
  18. nginx和ftp搭建图片服务器
  19. 5分钟了解《代码整洁之道》精华
  20. 基于STM32智能小车蓝牙遥控实验(有代码含上位机)

热门文章

  1. 又一个 Golang 编写的僵尸网络:KmsdBot
  2. Sentinel-Redis高可用方案(二):主从切换
  3. 从库延迟增大,MySQL日志出现InnoDB: page_cleaner: 1000ms intended loop took 17915ms.
  4. Go语言6种字符串拼接的方式
  5. 2019-12-24
  6. MAC 软件避坑之坚果云
  7. 10.statement对象实例(executeUpdate方法以及executeQuery方法),JDBC工具类编写
  8. 黄东旭:开发者的“技术无感化”时代,从 Serverless HTAP 数据库开始 | PingCAP DevCon 2022
  9. 使用Canvas实现网页鼠标签名效果
  10. 用二分法编写猜数字游戏(含:猜电脑随机数,和用户自己想的数字)python