cocos2dx休闲游戏--Fruit & Bird 开发学习(3)———RankBirdLayer

游戏行旁布景类

       主要分为RankBirdLayer和RankFruitLayer;这两个类的实现方法类似,在此处只列举一个RankBirdLayer类的实现。

首先是头文件的定义

#ifndef   __RANK_FRUIT_LAYER
#define  __RANK_FRUIT_LAYER


#include "cocos2d.h"
#include "GameSceneManager.h"

using namespace cocos2d;

class RankFruitLayer :public Layer
{
public:
	std::string  scoreFruit[5];//记录分数的字符串数组
	Label* labels;//声明一个指向分数的文本指针
	GameSceneManager* sceneManager;
public:
	virtual bool init();
	void save(int);//记录分数
	void load();//读取分数
	void menuCallBack0(Ref* pSender);//切换到主菜单场景
	void menuCallBack1(Ref* pSender);//切换到小鸟排行榜场景
	CREATE_FUNC(RankFruitLayer);
};
#endif

其次是源码的实现

#include "RankFruitLayer.h"
#include "RankBirdLayer.h"

using namespace std;
bool RankFruitLayer::init()
{
	if (!Layer::init())
		return false;

	//此处主要完成对界面的基本布局
	auto visibleSize = Director::getInstance()->getVisibleSize();
	auto origin = Director::getInstance()->getVisibleOrigin();
	auto backGround = Sprite::create("pic/morning.png");
	backGround->setAnchorPoint(Vec2::ZERO);
	backGround->setPosition(origin.x, origin.y + visibleSize.height - backGround->getContentSize().height);
	this->addChild(backGround);

	auto floor = Sprite::create("pic/floor.png");
	floor->setAnchorPoint(Vec2::ZERO);
	floor->setPosition(origin);
	this->addChild(floor);
	floor->runAction(RepeatForever::create(Sequence::create(MoveTo::create(0.5f, Vec2(-120, 0)), MoveTo::create(0, Vec2::ZERO), nullptr)));

	auto rank = Sprite::create("pic/rankBackground.png");
	rank->setPosition(Vec2(270, 530));
	this->addChild(rank, 1);

	auto title = Sprite::create("pic/rankFruit.png");
	title->setPosition(Vec2(270, 850));
	this->addChild(title, 1);

	auto menuItemMenu = MenuItemImage::create("button/menu.png", "button/menu_off.png", CC_CALLBACK_1(RankFruitLayer::menuCallBack0, this));
	menuItemMenu->setPosition(80, 50);

	auto menuItemNext = MenuItemImage::create("button/back.png", "button/back_off.png", CC_CALLBACK_1(RankFruitLayer::menuCallBack1, this));
	menuItemNext->setPosition(460, 50);

	auto mn = Menu::create(menuItemMenu, menuItemNext, nullptr);
	mn->setPosition(Vec2::ZERO);
	this->addChild(mn, 1);

//实现分数排行榜:排名--分数的形式
	int *tempFruit = new int[5];//创建一个整形数组,用于保存分数
	load();//读入分数
	for (int i = 0; i < 5; i++)
	{
		string score;
 		string num = Value(i + 1).asString();
		tempFruit[i] = Value(scoreFruit[i]).asInt();
		if (tempFruit[i] == 0)
			score = "-";
		else
			score = scoreFruit[i];
		labels = Label::createWithTTF(num, "fonts/FZKATJW.ttf", 60);//labes指针指向 排名label
		rank->addChild(labels, 2);
		labels->setPosition(90, 280 - (50 * i));
		labels->enableOutline(Color4B(187, 187, 187, 255), 2);//给labels字符串描边
		labels = Label::createWithTTF(score, "fonts/FZKATJW.ttf", 60);//labes指针指向 分数label
		rank->addChild(labels, 2);
		labels->setPosition(315, 280 - (50 * i));
		labels->enableOutline(Color4B(187, 187, 187, 255), 2);
	}
	return true;
}


void RankFruitLayer::load()
{
	for (int i = 0; i < 5; i++)
	{
		scoreFruit[i] = UserDefault::getInstance()->getStringForKey(Value(i+1).asString().c_str(), "0");
	}
}

void RankFruitLayer::save(int newScore)
{
	string score;//记录分数
	string oldScore;//旧分数
	int *tempBird = new int[5];//创建一个整形数组,用来存储分数
	load();//把已有的分数读入scoreBird中(分数字符串)
	for (int i = 0; i < 5; i++)
		tempBird[i] = Value(scoreFruit[i]).asInt();//将分数字符串转换成对应的整形分数
	for (int i = 4; i >= 0; i--)
	{
		if (newScore >= tempBird[i])//新分数与最低所得分数进行比较,基本逻辑:新分数取代当前分数,当前分数下移
		{
			score = Value(newScore).asString();
			if (i != 4)
			{
				oldScore = scoreFruit[i];//将当前分数字符串用oldScore保存
				UserDefault::getInstance()->setStringForKey(Value(i + 1).asString().c_str(), oldScore);
			}
			UserDefault::getInstance()->setStringForKey((Value(i).asString()).c_str(), score);//如果
		}
		else
			break;//当新分数,不在大于tempBird[i],循环暂停
	}
}

void RankFruitLayer::menuCallBack0(Ref* pSender)//回到主场景
{
	sceneManager->goToMainScene();
}

void RankFruitLayer::menuCallBack1(Ref* pSender)//切换到下一个排行榜的回调方法
{
	sceneManager->goToRankBirdScene();
}

游戏排行榜的效果图(分别是进击的小鸟和水果大逃亡界面)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值