***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

满满的泪啊。

从5月22日写的第一篇,于6月6日结束。

中间各种课程、上机、大作业穿插。焦头烂额的。

最后最终做出来几乎相同的样子了。。

PS:写博客这几天。宿舍一直停电状态。。

。真是醉了。。

本篇实现的功能:

> 粒子特效

> 音乐音效

> 漂浮文字

> combo特效 及 每关结束后星星的消除(小于等于10个的一个个消除。剩余的一齐消除)

> 最高分存储、场景的简单存储

> 消除星星的Hint

一、粒子特效

粒子特效,主要是星星消除后的爆炸效果。

 
                   

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHR0cmVl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

这里主要用了两个函数:

▪ 产生爆炸粒子特效

▪ 获取点击星星的颜色

void starSpecialEffect(Star* sta,Point position,Node* node,int staNum)
{
// 创建爆炸粒子效果,粒子数量为 staNum 个
ParticleExplosion* effect = ParticleExplosion::createWithTotalParticles(staNum);
// 设置此粒子特效的纹理图片
effect->setTexture(Director::getInstance()->getTextureCache()->addImage("star.png"));
// 设置開始时候的粒子颜色
effect->setStartColor(getColor4F(sta->getImgIndex()));
effect->setStartColorVar(Color4F(0,0,0,1));
effect->setEndColor(getColor4F(sta->getImgIndex()));
effect->setEndColorVar(Color4F(0,0,0,1));
// 设置開始时的粒子大小
effect->setStartSize(20.0f);
effect->setGravity(Point(0,-300));
// 设置粒子生命周期
effect->setLife(2.0f);
// 设置粒子速度
effect->setSpeed(200);
effect->setSpeedVar(10);
// 设置粒子位置
effect->setPosition(position);
node->addChild(effect,2);
} Color4F getColor4F(int imgIndex)
{
switch(imgIndex){
case 0:
//red
return Color4F::RED;
case 1:
//blue
return Color4F::BLUE;
case 2:
//green
return Color4F::GREEN;
case 3:
//purple
return Color4F(128.0f,0,128.0f,1.0f);
case 4:
//yellow
return Color4F::YELLOW;
}
return Color4F(1,1,1,0);
}

详细粒子特效的应用,等有时间做一个单独的博文发出来。。

二、音乐音效

这里用了UserDefault进行存储,音乐音效的开关,

音乐和音效同一开关。没有分开。

主要就是 Android对于 ogg 格式的音乐支持是最好的。

可是在Windows平台不好測试。由于Windows自带的WMP(Windows Media Player)不支持这个格式的音乐播放。即使没有路,我们自己创造路来走,有大牛就开发了一款解码软件—— K-Lite Codec Pack,

我的WMP是能够播放ogg了,cocos2d-x 还是须要修改一下,临时没改好,

于是。。。阉割了。。

我是在Windows用 mp3格式 測试,然后在Android用ogg格式的,效果挺好

之前的三消游戏中。非常多人就说音乐播放不出来。没有效果,

可是我自己试的是没问题的。偶尔还真有一两个音效不好用。我认为还是格式问题,

各个音效部分,我就不多说了。在对应位置插入即可,

背景音乐。须要 重载虚函数

virtual void onEnterTransitionDidFinish();
virtual void cleanup();

onEnterTransitionDidFinish是在场景载入完毕后进行,

不同于onEnter。onEnter是场景開始载入就进行,

cleanup 函数。是在场景被消除时的动作,

我们的背景音乐就是要在这两个函数中增加:

void WelcomeScene::onEnterTransitionDidFinish()
{
Layer::onEnterTransitionDidFinish();
if ( userDefault->getBoolForKey("MusicKey") ) {
SimpleAudioEngine::getInstance()->playBackgroundMusic("Music/music.ogg", true);
}
}
void WelcomeScene::cleanup()
{
Layer::cleanup();
SimpleAudioEngine::getInstance()->stopBackgroundMusic();
}

对于音乐音效说的也就这么多了

三、漂浮文字

漂浮文字效果,单独开了一个类,

基本的创建函数:

FloatWord* FloatWord::create( const std::string& word,const int fontSize,Vec2 begin )
{
FloatWord* fw = new FloatWord();
if( !fw->init(word,fontSize,begin) ) {
return NULL;
} fw->autorelease();
return fw;
}

几个基本的工具函数:

void FloatWord::floatInOut(const float speed,const float delayTime,std::function<void()> callback){

	MoveTo* moveIn = MoveTo::create(speed,Vec2(GAME_SCREEN_WIDTH/2,fw_begin.y));
MoveTo* moveOut = MoveTo::create(speed,Vec2(-fw_label->getContentSize().width,fw_begin.y)); CallFunc* call = CallFunc::create(callback); Sequence* action = Sequence::create(moveIn,DelayTime::create(delayTime),moveOut,call,NULL);
fw_label->runAction(action);
} void FloatWord::floatIn(const float speed){ MoveTo* moveIn = MoveTo::create(speed,Vec2(GAME_SCREEN_WIDTH/2,fw_begin.y)); Sequence* action = Sequence::create(moveIn,NULL);
fw_label->runAction(action);
} void FloatWord::floatOut(const float speed,const float delayTime){ MoveTo* moveOut = MoveTo::create(speed,Vec2(-fw_label->getContentSize().width,fw_begin.y)); Sequence* action = Sequence::create(DelayTime::create(delayTime),moveOut,NULL);
fw_label->runAction(action);
}

就是将动作 Sequence起来了,按顺序播放即可了

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHR0cmVl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt=""> 
                              

四、combo特效 及  每关结束后星星的消除

首先是 combo 特效,做一个函数,然后每次消除的时候,推断消除的个数是否满足combo特效触发条件就可以。

void comboEffect(int num,Node* node){

	if( num < 5 )
return; Sprite* comboSprite;
if( num >= 10 ){
comboSprite = Sprite::create("combo_3.png");
}else if( num >= 7 ){
comboSprite = Sprite::create("combo_2.png");
}else{
comboSprite = Sprite::create("combo_1.png");
} comboSprite->setPosition(Vec2(GAME_SCREEN_WIDTH/2,GAME_SCREEN_HEIGHT/2));
node->addChild(comboSprite,4); Blink* blink = Blink::create(1.0f,5);
CallFunc* remove = CallFunc::create([=](){comboSprite->removeFromParentAndCleanup(true);});
Sequence* action = Sequence::create(blink,remove,nullptr);
comboSprite->runAction(action);
}

最后星星的消除。这里我的处理比較麻烦:

1.推断此关卡结束(没有能够消除的星星),然后将 全局的 关卡结束 变量 设置为 true,获得剩余星星的数量,假设剩余星星数量大于10 则 设置为10(由于一个一个消除的效果,最多10个)

2.在 update函数中(每一帧都会调用的函数),会推断关卡是否结束,若结束。会调用 消除函数,10个以内,每消除一个都会返回,不会继续消除。并且记录消除时间,消除一次后一定时间间隔再进行下一次消除

3.消除完10个(或者小于10个)以后,不会再返回,会一次性将剩余星星消除完成,将 关卡结束 变量设置为false。

这里的: 关卡结束一系列操作:

if( isFinish() )	{
isLevelFinish = true;
int temp = totalStarNum(); if( temp <= 10 ) {
needDelOneByOne = temp;
}
}
else
{
needDelOneByOne = 10;
}

update函数:

void GameScene::update( float dt )
{
// 分数变化
Label *labelScore = (Label *)this -> getChildByTag(6);
labelScore -> setString( StringUtils::format("Score: %d ",_score)); // 假设当前关卡结束 星星一个个消除的实现
if( isLevelFinish ) { deleteTime += dt;
if( deleteTime > DELSTAR_ONEBYONE_TIME ) {
popFinishStar(needDelOneByOne);
needDelOneByOne--;
deleteTime = 0;
}
}
}

消除结束星星函数:

void GameScene::popFinishStar( int n )
{
int r,c;
Star* sta; for( r = ROWS-1 ; r >= 0 ; r-- ) {
for( c = 0 ; c < COLS ; c++ ) {
sta = map[r][c];
if( sta ) {
starSpecialEffect(sta,sta->getPosition(),this,5);
map[r][c]=NULL;
sta->removeFromParentAndCleanup(true);
return;
}
else
{
starSpecialEffect(sta,sta->getPosition(),this,totalStarNum()*4);
map[r][c]=NULL;
sta->removeFromParentAndCleanup(true);
}
}
}
} isLevelFinish = false;
scheduleOnce(schedule_selector(GameScene::levelOver),2.0f);
}

                           
             

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHR0cmVl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

五、最高分的存储。场景的简单存储

最高分的存储,还是用了userdefault,

就是在游戏结束的时候。推断一下是否破纪录:

if( userDefault->getIntegerForKey("HightScore") < _score )
userDefault->setIntegerForKey("HightScore",_score);

场景的存储。用了 push 和 pop,

在主界面定义一个变量,来推断能否够继续,

刚进入主界面时,场景栈是没有场景存储的,此时点击 继续游戏 就会退出游戏,

所以要在场景栈没有场景时,不同意点击 继续游戏 button。

这个变量,在从游戏界面跳转到主界面(通过返回函数跳转)时。会设置为true。就是能够点击。

六、消除星星Hint

当消除几个星星,我们都要有提示。加了几分。

游戏结束,假设剩余星星数量小于10个,都要有额外分数的添加。

星星消除函数是这种:

一个等差数列,第一个星星 5分,第二个15分,第三个25分(首项为5,公差为10的等差数列)

所以,假设消除n个星星,就是用到等差数列的求和公式了:

n*5+n*(n-1)*10/2

剩余星星数量。所获得的额外分数则建立了一个数组,放在GameDefine头文件,

// 剩余星星所奖励的分数
static const int rewardScore[11] = {
2000,
1980,
1920,
1820,
1680,
1500,
1280,
1020,
720,
380,
0
};

                                  

到这里,消灭星星系列完美结束啦~~~

撒花。。。

接下来把历史遗留下的问题——别踩白块 剩下部分搞定,

然后要做第一款自己想的游戏了,

敬请期待呀~~~

本文源代码:    >  这里  <

终于APK:    >
here <

***************************************转载请注明出处:http://blog.csdn.net/lttree********************************************

Cocos2d-x 3.4 之 消灭星星 &gt; 第三篇(终) &lt;的更多相关文章

  1. Pascal小游戏 不要消灭星星

    不要消灭星星 Pascal小游戏 Chaobs改编自pascal吧 控制台小游戏嘛,就当是练习一下结构化的写法. program wxtw; uses crt; type      zbdy=reco ...

  2. 消灭星星的数组高效率算法(c++代码,控制台程序)

    #include <iostream> using namespace std; #define ROW 12 #define COL 10 class Star { public: en ...

  3. 关于cocos2d和cocos2dx,还有iOS上的cocos2d的ARC问题

    好吧,我承认这个我花了N个小时所做的努力都白费了. 事情的开始是这样的,今天在写cocos2dx的时候,测试发现总是出现溢出的问题,总是在main.m的autorelease报错.(好吧,如果我以后发 ...

  4. 手把手教你如何使用Cocos2d Console 进行html5项目发布

    手把手教你如何使用Cocos2d Console 进行html5项目发布   1.首先需要先安装Cocos2d Console运行需要的工具. 详情参见 这篇文章 http://www.cocoach ...

  5. 消除类游戏(js版)

    最近一直在玩一款消灭星星的消除类游戏,周末无聊就用js也写了一遍,感觉玩比写还困难一直玩不到10000分.废话不多说直接上源码. 效果图(ps 页面有点难看木有美工) 代码总共456行,未经过严格测试 ...

  6. 寒假的ACM训练(一)

    今天开始ACM训练,选择了刘汝佳的<挑战编程>,暂时算是开始了. 测评的网址: http://www.programming-challenges.com 第一个题目是水题啦.3n+1. ...

  7. 一 手游开发工具cocos2d-x editor初识

    可学习的demo: 7个实战项目 flappybird(飞扬小鸟).popstar(消灭星星).fruitninja(水果忍者).2048(数度消除). moonwarriors(月亮战神).frui ...

  8. [留念贴] C#开发技术期末大作业——星月之痕

    明天就要去上海大学参加 2015赛季 ACM/ICPC最后一场比赛 —— EC-Final,在这之前,顺利地把期末大作业赶出来了. 在这种期末大作业10个人里面有9个是从网上下载的国内计算机水平五六流 ...

  9. Unity 工作经历+近期面试经历

    由于团队解散,这最近都在找新工作机会--投简历找工作.已经面试三家了,都没拿到offer,挺失落的.把这种感受记录下来,以作后鉴. 这本质上是一篇面试经历的记录,并不是什么面试攻略,主要是给自己总结的 ...

随机推荐

  1. POJ 3177--Redundant Paths【无向图添加最少的边成为边双连通图 &amp;&amp; tarjan求ebc &amp;&amp; 缩点构造缩点树】

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10798   Accepted: 4626 ...

  2. 使用Service Bus Topic 实现简单的聊天室

    创建Service Bus能够參照: https://azure.microsoft.com/en-gb/documentation/articles/service-bus-dotnet-how-t ...

  3. Android应用之——微信微博第三方sdk登录分享使用过程中的一些常见问题

    前言 近期在使用第三方登录和分享的过程中遇到了非常多问题,一方面能够归结为自己经验的不足,还有一方面事实上也说明了官方文档的含糊不清.这篇博文不会写关于怎样使用第三方登录分享,由于官方文档已经写明了步 ...

  4. js中的三种函数写法

    js中的三种函数写法 <script type="text/javascript"> //普通的声明方式 function myFun(m,n){ alert(m+n) ...

  5. ES 内存使用和GC指标——主节点每30秒会去检查其他节点的状态,如果任何节点的垃圾回收时间超过30秒(Garbage collection duration),则会导致主节点任务该节点脱离集群。

    摘录自:http://blog.csdn.net/yangwenbo214/article/details/74000458 内存使用和GC指标 在运行Elasticsearch时,内存是您要密切监控 ...

  6. 最大似然估计的缺陷 —— 方差和均值的 bias

    0. 均匀分布期望的最大似然估计 首先我们来看,如何通过最大似然估计的形式估计均匀分布的期望.均匀分布的概率密度函数为:f(x|θ)=1θ,0≤x≤θ.不失一般性地,将 x1,x2,-,xn 排序为顺 ...

  7. MyEclipse 安装svn 插件步骤详情

    方法一:在线安装 打开HELP- > MyEclipse Configuration Center.切换到SoftWare标签页. 点击Add Site 打开对话框,在对话框Name输入Svn, ...

  8. Redis学习笔记(五) 基本命令:Hash操作

    原文链接:http://doc.redisfans.com/hash/index.html 学习前先明确一下概念,这里我们把Redis的key称作key(键),把数据结构hash中的key称为fiel ...

  9. BZOJ 1806 DP

    思路: f[i][a][b][c][d] 表示在第i天 昨天1矿吃的是a 前天1矿吃的是b 昨天2矿吃的是c 前天2矿吃的是d 的最优解 暴力转移 哦 需要优化一下空间- 变成i%2 就好了 //By ...

  10. C# 异步编程学习(一)

    异步 编程 可在 等待 某个 任务 完成时, 避免 线程 的 占用, 但要 想 正确地 实现 编程, 仍然 十分 伤脑筋. . NET Framework 中, 有三种 不同 的 模型 来 简化 异步 ...