微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cocos2d-x 3.2 之 三消类游戏——万圣大作战 (第四篇)

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


呼呼,第四篇咯,

本篇主要讲述

> 时间

> 分数

本篇结束后,整个三消游戏的基本步骤就搞定了




1. 添加时间

一般消除类游戏,要么关卡,要么限制时间,但是关卡的设计很麻烦,个体创作,没有那么多精力,

所以只能通过限制时间来使游戏有些可玩性,但这种可玩性极低啊,反复挑战同样的东西,很容易疲劳的。

在程序中加时间,如何操作呢?

当然,先要有个 时间 的全局变量,在初始化游戏界面的时候,显示在屏幕上:

// 加载ttf字体
	TTFConfig config("fonts/haibaoti.ttf",30);
	// 游戏时间的显示
	auto labelTime = Label::createWithTTF(config,StringUtils::format("Time: %d ",m_time));
	labelTime -> setPosition(Vec2( labelTime->getContentSize().width,GAME_SCREEN_HEIGHT - labelTime->getContentSize().height ));
	labelTime -> setTag(11);
	this ->addChild(labelTime);


然后还要有个函数,让它每秒都会减少

void GameScene::myClock( float dt )
{
	// 时间变化
	--m_time;
	// 如果时间归0,那么执行游戏结束动画,并跳到游戏结束界面
	if( m_time == 0 )
	{
		Label *labelTime = (Label *)this -> getChildByTag(11);
		labelTime->setScale(0);

		// 游戏结束 动画
		auto gmov = Sprite::create("pic_gameover.png");
		gmov->setPosition(Point(GAME_SCREEN_WIDTH/2,GAME_SCREEN_HEIGHT*1.5));
		this->addChild(gmov);

		auto action = Moveto::create(3.0f,Point(GAME_SCREEN_WIDTH/2,GAME_SCREEN_HEIGHT/2));  

		gmov -> runAction( action );

		// 跳转到游戏结束界面
		return;
	}
	// 如果还有时间,那么时间减少
	if( m_time > 0 )	{
		Label *labelTime = (Label *)this -> getChildByTag(11);
		labelTime -> setString( StringUtils::format("Time: %d ",m_time));
	}
}


但是,别忘了最重要的一步,要将 这个 倒计时函数 加入到计划任务中,就像之前我们用的检查精灵。

之前检查精灵用的是 scheduleUpdate,每一帧都要执行,

而这次,我们用 schedule 就可以,自己指定函数,并且设定间隔时间。

就放在 scheduleUpdate 下面就可以啦。

schedule(schedule_selector(GameScene::myClock),1.0f );


然后运行一下,就可以看到倒计时的实现啦。

然后,我们再建立 游戏结束界面,界面里放 返回游戏,返回主界面 和 退出 三个按钮,就可以啦。

代码就不贴出,具体的可以看文章末尾 给出的源码。




2. 添加分数

光有时间倒计时可不行,要有分数才有意思!

和时间一样,也要初始化界面中将分数在游戏界面显示出来

// 分数显示
	auto labelscore = Label::createWithTTF(config,StringUtils::format("score: %d ",m_score) );
	labelscore -> setPosition(Vec2( GAME_SCREEN_WIDTH/2,GAME_SCREEN_HEIGHT - labelscore->getContentSize().height*2.6 ));
	labelscore -> setTag(10);
	this->addChild(labelscore);


但是 分数 就不需要像时间那样,单独弄一个函数,分数是时时刷新的,所以跟随每帧刷新即可,就是在update函数加上分数的显示

// GameScene.cpp  update()函数

// 分数变化
	Label *labelscore = (Label *)this -> getChildByTag(10);
	labelscore -> setString( StringUtils::format("score: %d ",m_score));


然后在相应位置,进行分数的加,

我是在 精灵下落 处,每消除一个精灵加30分

// GameScene.cpp  修改后的 fillSprite

// 填补空缺位置
void GameScene::fillSprite()	{

	// 下落精灵总个数(方便后面分数的计算)
	int sum = 0;
	 // 重置移动方向标志
    isAction = true;

    int *colEmptyInfo = (int *)malloc(sizeof(int) * COLS);
    memset((void *)colEmptyInfo,sizeof(int) * COLS);
    
    // 将存在的精灵降落下来
	SpriteShape *spr = NULL;
    for (int c = 0; c < COLS; c++) {
        int removedSpriteOfCol = 0;
        // 自底向上
        for (int r = 0; r < ROWS; r++ ) {
            spr = map[r][c];
            if ( spr == NULL ) {
                ++removedSpriteOfCol;
            } else {
                if ( removedSpriteOfCol > 0) {
                    int newRow = r - removedSpriteOfCol;
                    map[newRow][c] = spr;
                    map[r][c] = NULL;
                  
                    Point startPosition = spr->getPosition();
                    Point endPosition = positionOfItem(newRow,c);
					float speed = (startPosition.y - endPosition.y) / GAME_SCREEN_HEIGHT*3;
                    spr->stopAllActions();
                    spr->runAction(CCMoveto::create(speed,endPosition));
                    
                    spr->setRow(newRow);
                }
            }
        }
        
        // 记录相应列数移除的数量
        colEmptyInfo[c] = removedSpriteOfCol;
		sum+=removedSpriteOfCol;
    }
    
    // 新建新的精灵,并降落
    for (int c = 0; c < COLS; ++c ) {
        for (int r = ROWS - colEmptyInfo[c]; r < ROWS ; ++r ) {
            createSprite(r,c);
        }
    }
    
	m_score += sum*30;
    free(colEmptyInfo);
}


接下里,就是在游戏结束界面,将自己的分数传递过去。

如果看源码,会发现, 在时间到0时,我用的 scheduleOnce ( 有个动画,要delay一下)

然后跳转一个 游戏结束 函数,就是在这函数,进行了分数的传递。

当然,相应的 GameOverScene中,也要设置相应的函数来接受分数。

// GameScene.cpp

// 游戏结束函数
void GameScene::gameOver(float dt)
{
	auto scene = Scene::create();
	auto layer = GameOver::create();
	// 传递当前游戏获得的分数
	layer -> setscore( m_score );
	scene -> addChild( layer );

	CCTransitionScene* reScene= CCTransitionFadeUp::create(1.0f,scene);
	CCDirector::sharedDirector()->replaceScene(reScene);
}


// GameOverScene.cpp 

void GameOver::setscore( int sc )
{
	auto labelscore = (Label *)this -> getChildByTag(13);
	labelscore -> setString( StringUtils::format(" %d ",sc));
}


Ok啦,现在可以运行爽爽啦

现在做的小编已经有基本雏形了,

剩下的就属于额外的东西,往上添加就行了。

后面的文章将会对 本游戏 进行修饰,比如:

—— 消除的特效

—— 消除4个,产生消除一列 或者 一行的小编

—— 音乐、音效的添加

—— 最高分的记录

等等~



本文源码: > 这里 <



********************************************

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建