(十三) 分数场景
最后更新于:2022-04-01 16:12:34
分数场景要用到TableView,这个之前也没用过,主要参考网上的代码。cocos2d-x的功能十分强大,以后还有好多东西要学啊!
分数场景类的.h文件中的内容
~~~
class ScoreScene : public Layer, public TableViewDataSource, public TableViewDelegate
{
public:
ScoreScene();
~ScoreScene();
public:
static Scene * createScene();
bool init();
CREATE_FUNC(ScoreScene);
public:
void tableCellTouched(TableView *table, TableViewCell * cell){};
TableViewCell * tableCellAtIndex(TableView * table, ssize_t index);
Size tableCellSizeForIndex(TableView * table, ssize_t index);
ssize_t numberOfCellsInTableView(TableView * table);
void scrollViewDidScroll(ScrollView *){};
void scrollViewDidZoom(ScrollView *){};
//对返回键的响应
void onKeyReleased(EventKeyboard::KeyCode keyCode, Event * pEvent);
private:
Size size;
~~~
.cpp文件
~~~
ScoreScene::ScoreScene()
{
}
ScoreScene::~ScoreScene()
{
_eventDispatcher->removeEventListenersForTarget(this);
}
Scene * ScoreScene::createScene()
{
auto scene = Scene::create();
auto layer = ScoreScene::create();
scene->addChild(layer);
return scene;
}
bool ScoreScene::init()
{
if (!Layer::init())
return false;
//背景音乐
CocosDenshion::SimpleAudioEngine::getInstance()->stopBackgroundMusic(true);
CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/BackgroundMusic2.mp3", true);
size = Director::getInstance()->getWinSize();
//添加背景图片
auto background = Sprite::createWithSpriteFrameName("backgroundTollgateTwo.png");
background->setPosition(Point(size.width / 2, size.height / 2));
background->setAnchorPoint(Vec2(0.5, 0.5));
this->addChild(background);
//创建tableView并设置一些参数
auto tableView = TableView::create(this, Size(size.width, size.height*0.8));
//设置滑动方向
tableView->setDirection(ScrollView::Direction::VERTICAL);
//设置TableViewDelegate
tableView->setDelegate(this);
//index的大小是从上到下依次增大
tableView->setVerticalFillOrder(TableView::VerticalFillOrder::TOP_DOWN);
//用当前的配置刷新cell
tableView->reloadData();
this->addChild(tableView);
//排名
auto dictionary = Dictionary::createWithContentsOfFile("fonts/AboutMe.xml");
auto rankNum = Label::createWithTTF(
((__String*)(dictionary->objectForKey("rankNum")))->getCString(),
"fonts/DFPShaoNvW5-GB.ttf",
40);
rankNum->setColor(Color3B(255, 0, 0));
rankNum->setPosition(Point(size.width*0.4, size.height*0.9));
this->addChild(rankNum);
//得分
auto rankScore = Label::createWithTTF(
((__String*)(dictionary->objectForKey("rankScore")))->getCString(),
"fonts/DFPShaoNvW5-GB.ttf",
40);
rankScore->setPosition(Point(size.width*0.8, size.height*0.9));
rankScore->setColor(Color3B(255, 0, 0));
this->addChild(rankScore);
//对返回键的响应
auto listener = EventListenerKeyboard::create();
listener->onKeyReleased = CC_CALLBACK_2(ScoreScene::onKeyReleased, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
return true;
}
//对返回键的响应
void ScoreScene::onKeyReleased(EventKeyboard::KeyCode keyCode, Event * pEvent)
{
if (keyCode == EventKeyboard::KeyCode::KEY_ESCAPE)
{
//背景音乐
CocosDenshion::SimpleAudioEngine::getInstance()->stopBackgroundMusic(true);
CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("sound/game_start.mp3", true);
//场景弹出
Director::getInstance()->popScene();
}
}
//用来设置每个cell的内容的
TableViewCell * ScoreScene::tableCellAtIndex(TableView * table, ssize_t index)
{
//设置每条记录前边的文本内容
auto index_text = __String::createWithFormat("%ld", index + 1);
TableViewCell * cell = table->dequeueCell();
if (cell == NULL)
{
//创建一个cell
cell = new TableViewCell();
cell->autorelease();
//创建显示排名的文本信息
auto text = Label::createWithTTF(index_text->getCString(), "fonts/DFPShaoNvW5-GB.ttf", 24);
text->setTag(1024);
text->setColor(Color3B(255, 0, 0));
//文本信息在cell的中间
text->setPosition(Point(size.width*0.4, size.height*0.025));
cell->addChild(text);
//显示用户得分的文本信息
auto index_score = __String::createWithFormat("%d", index);
//根据index值获得得分的文本,因为这个时候的score是int型,所以还需要转化一下类型
int i_score = UserDefault::getInstance()->getIntegerForKey(index_score->getCString());
auto * str = __String::createWithFormat("%d", i_score);
auto score = Label::createWithTTF(
str->getCString(), "fonts/DFPShaoNvW5-GB.ttf", 24);
score->setTag(2048);
//设置坐标
score->setPosition(Point(size.width*0.8, size.height*0.025));
score->setColor(Color3B(255, 0, 0));
cell->addChild(score);
}
//这里获得的cell是原来的cell,所以原来cell的文本信息等还是原来的,所以要做一些改变
else
{
//通过tag值获得文本,并且改变
auto text = (Label *)cell->getChildByTag(1024);
text->setString(index_text->getCString());
//改变分数
auto * score = (Label *)cell->getChildByTag(2048);
auto * index_score = __String::createWithFormat("%d", index);
int i_score = UserDefault::getInstance()->getIntegerForKey(index_score->getCString());
auto * str = __String::createWithFormat("%d", i_score);
score->setString(str->getCString());
if (cell->getChildByTag(100) != NULL)
{
Sprite * sprite = (Sprite *)cell->getChildByTag(100);
sprite->removeFromParentAndCleanup(true);
}
}
if (index == 0 || index == 1 || index == 2)
{
Sprite * sprite;
switch (index)
{
case 0:
sprite = Sprite::createWithSpriteFrameName("gold.png");
break;
case 1:
sprite = Sprite::createWithSpriteFrameName("silvere.png");
break;
case 2:
sprite = Sprite::createWithSpriteFrameName("copper.png");
break;
}
sprite->setPosition(Point(size.width*0.15, size.height*0.025));
sprite->setTag(100);
cell->addChild(sprite);
}
return cell;
}
//这个函数是用来设置每个cell的大小的
Size ScoreScene::tableCellSizeForIndex(TableView * table, ssize_t index)
{
return Size(size.width, size.height*0.05);
}
//这个函数是用来设置cell的个数的
ssize_t ScoreScene::numberOfCellsInTableView(TableView * table)
{
//个数是从XML文件中读取到的,有多少条记录,就设置多少个cell,如果刚开始没有count这个字段,就返回0
int count = UserDefault::getInstance()->getIntegerForKey("count", 0);
return count;
}
~~~
好了,这个游戏到这里就已经完成啦!再有的就是移植到其它平台了。我是将这个游戏移植到了Android平台。
代码以及资源文件
[资源文件](http://download.csdn.net/detail/u011694809/9038951)