您的位置:首页 > 移动开发 > 微信开发

使用3.0实现微信打飞机——11.分数排行榜的实现

2014-08-21 15:33 465 查看
分数排行榜的做法和我在小塔1024中的实现原理是一样的,这里用的是3.0的引擎,所以函数的参数有些许的不同,这里说明俩处需要注意的问题,一个是扩展库的问题,在3.0中扩展的项目是没有引入到工程中的,所以需要自己手动将扩展项目引入进来,这样才能使用TableView,方法请参考3.0回调函数的新用法。另一个问题是实现TableViewDelegate和TableViewDataSource的虚函数时候index参数的类型原来是unsigned
int,3.0变成了ssite_t,这里需要注意一下,因为本人就是没有注意这个参数的类型导致出现了莫名其妙的错误,好了,代码如下。

1
#ifndef _SCORE_SCENE_H_
2
#define _SCORE_SCENE_H_
3
#include "cocos2d.h"
4
//使用tableview必须包含扩展库
5
#include "cocos-ext.h"
6
7
USING_NS_CC;
8
USING_NS_CC_EXT;
9
10
//分数榜场景,使用tableview必须继承以下的类
11
class
ScoreScene :
public
Layer,
public

TableViewDataSource,
public

TableViewDelegate
12
{
13
public
:
14
ScoreScene(
void
);
15
~ScoreScene(
void
);
16
public
:
17
static

Scene * createScene();
18
bool

init();
19
CREATE_FUNC(ScoreScene);
20
public
:
21
//实现上述接口需要实现的虚函数如下,这里有非常重要的一点就是函数的参数index原来2.x的版本类型为
22
//unsigned int而现在改为了ssize_t类型,必须写这个类型,用原来的类型会出现错误,本人就是因为这个错误
23
//耽误了很多的时间
24
void

tableCellTouched(TableView *table,TableViewCell * cell){};

//这里是设置当我们点击每个cell的时候触发的函数,这里我把它置为空的实现,因为我们只是需要读取分数的记录
25
TableViewCell * tableCellAtIndex(TableView * table,ssize_t index);
26
Size tableCellSizeForIndex(TableView * table,ssize_t index);
27
//3.0的返回值有所不同
28
ssize_t numberOfCellsInTableView(TableView * table);
29
//继承ScrollViewDelegate接口需要覆写的方法,这里把方法的实现留空
30
void

scrollViewDidScroll(ScrollView * ){};
31
void

scrollViewDidZoom(ScrollView *){};
32
//对android返回键的响应
33
void

onKeyReleased(EventKeyboard::KeyCode keyCode,Event * pEvent);
34
private
:
35
//设备尺寸
36
Size size;
37
};
38
39
#endif
1
#include "ScoreScene.h"
2
3
ScoreScene::ScoreScene(
void
)
4
{
5
}
6
7
ScoreScene::~ScoreScene(
void
)
8
{
9
//在析构函数中移除监听器,这里传递的参数this就是添加监听器到事件分发器中的this
10
_eventDispatcher->removeEventListenersForTarget(
this
);
11
}
12
13
Scene * ScoreScene::createScene()
14
{
15
auto scene = Scene::create();
16
auto layer = ScoreScene::create();
17
scene->addChild(layer);
18
return

scene;
19
}
20
21
bool
ScoreScene::init()
22
{
23
if
(!Layer::init())
24
return

false
;
25
26
size = Director::getInstance()->getWinSize();
27
28
//添加背景图片
29
auto background = Sprite::createWithSpriteFrameName(
"background.png"
);
30
background->setPosition(Point(size.width/2,size.height/2));
31
this
->addChild(background);
32
33
//创建tableView并设置一些参数
34
auto tableView = TableView::create(
this
,Size(size.width,size.height*0.6));
35
//设置滑动方向
36
tableView->setDirection(ScrollView::Direction::VERTICAL);
37
//设置TableViewDelegate
38
tableView->setDelegate(
this
);
39
//index的大小是从上到下依次增大
40
tableView->setVerticalFillOrder(TableView::VerticalFillOrder::TOP_DOWN);
41
//用当前的配置刷新cell
42
tableView->reloadData();
43
this
->addChild(tableView);
44
45
//排行榜
46
//排名
47
auto rankNum = Label::createWithTTF(
"rank"
,
"font/arial.ttf"
,40);
48
rankNum->setColor(Color3B(100,100,100));
49
rankNum->setPosition(Point(size.width*0.4,size.height*0.7));
50
this
->addChild(rankNum);
51
//得分
52
auto rankScore = Label::createWithTTF(
"score"
,
"font/arial.ttf"
,40);
53
rankScore->setPosition(Point(size.width*0.8,size.height*0.7));
54
rankScore->setColor(Color3B(100,100,100));
55
this
->addChild(rankScore);
56
57
//对用户返回键的响应
58
auto listener = EventListenerKeyboard::create();
59
listener->onKeyReleased = CC_CALLBACK_2(ScoreScene::onKeyReleased,
this
);
60
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
this
);
61
62
return

true
;
63
}
64
65
//对返回键的响应
66
void
ScoreScene::onKeyReleased(EventKeyboard::KeyCode keyCode,Event * pEvent)
67
{
68
if
(keyCode == EventKeyboard::KeyCode::KEY_BACKSPACE)
69
//将开始场景弹出
70
Director::getInstance()->popScene();
71
}
72
73
//这个函数比较关键,是用来设置每个cell的内容的
74
TableViewCell * ScoreScene::tableCellAtIndex(TableView * table,ssize_t index)
75
{
76
//设置每条记录前边的文本内容
77
auto index_text = __String::createWithFormat(
"%ld"
,index+1);
78
79
//dequeuecell这个函数是获得一个可用的cell,因为如果我们没增加一条分数记录就创建一个cell,可想而知如果
80
//分数记录很多的话,cell不是超级的多了吗,这个时候内存占用就会很大,而这个函数的功能是把那些没有渲染的
81
//cell拿过来,这样的话就减小了内存的消耗
82
TableViewCell * cell = table->dequeueCell();
83
if
(cell == NULL)
84
{
85
//创建一个cell
86
cell =
new
TableViewCell();
87
cell->autorelease();
88
89
//创建显示排名的文本信息
90
auto text = Label::createWithTTF(index_text->getCString(),
"font/arial.ttf"
,24);
91
text->setTag(1024);
92
text->setColor(Color3B(100,100,100));
93
//文本信息在cell的中间
94
text->setPosition(Point(size.width*0.4,size.height*0.025));
95
cell->addChild(text);
96
97
//显示用户得分的文本信息
98
auto index_score = __String::createWithFormat(
"%d"
,index);
99
//根据index值获得得分的文本,因为这个时候的score是int型,所以还需要转化一下类型,这里有点麻烦
100
int

i_score = UserDefault::getInstance()->getIntegerForKey(index_score->getCString());
101
auto * str = __String::createWithFormat(
"%d"
,i_score);
102
auto score = Label::createWithTTF(
103
str->getCString(),
"font/arial.ttf"
,24);
104
score->setTag(2048);
105
//设置坐标
106
score->setPosition(Point(size.width*0.8,size.height*0.025));
107
score->setColor(Color3B(100,100,100));
108
cell->addChild(score);
109
110
}
111
//这里获得的cell是原来的cell,所以原来cell的文本信息等还是原来的,所以要做一些改变
112
else
113
{
114
//通过tag值获得文本,并且改变,虽然LabelTTF调用setString函数不好,但是这里为了省事就这么用吧
115
auto text = (Label *)cell->getChildByTag(1024);
116
text->setString(index_text->getCString());
117
118
//改变分数
119
auto * score = (Label *)cell->getChildByTag(2048);
120
auto * index_score = __String::createWithFormat(
"%d"
,index);
121
//根据index值获得得分的文本,因为这个时候的score是int型,所以还需要转化一下类型,这里有点麻烦
122
int

i_score = UserDefault::getInstance()->getIntegerForKey(index_score->getCString());
123
auto * str = __String::createWithFormat(
"%d"
,i_score);
124
score->setString(str->getCString());
125
126
if
(cell->getChildByTag(100) != NULL)
127
{
128
Sprite * sprite = (Sprite *)cell->getChildByTag(100);
129
sprite->removeFromParentAndCleanup(
true
);
130
}
131
}
132
133
if
(index == 0 || index==1 || index==2)
134
{
135
Sprite * sprite;
136
switch
(index)
137
{
138
//代表的是冠军
139
case

0:
140
sprite = Sprite::create(
"gold.png"
);
141
break
;
142
case

1:
143
sprite = Sprite::create(
"silvere.png"
);
144
break
;
145
case

2:
146
sprite = Sprite::create(
"tong.png"
);
147
break
;
148
}
149
sprite->setPosition(Point(size.width*0.15,size.height*0.025));
150
sprite->setTag(100);
151
cell->addChild(sprite);
152
}
153
154
return

cell;
155
}
156
157
//这个函数是用来设置每个cell的大小的
158
Size ScoreScene::tableCellSizeForIndex(TableView * table,ssize_t index)
159
{
160
return

Size(size.width,size.height*0.05);
161
}
162
163
//这个函数是用来设置cell的个数的
164
ssize_t ScoreScene::numberOfCellsInTableView(TableView * table)
165
{
166
//个数是从XML文件中读取到的,有多少条记录,就设置多少个cell,如果刚开始没有count这个字段,就返回0
167
int

count = UserDefault::getInstance()->getIntegerForKey(
"count"
,0);
168
169
return

count;
170
}
然后在开始游戏的场景中添加几个菜单用来选择进入分数榜的场景,代码如下。

1
//添加一个游戏开始按钮
2
auto playText = Label::createWithTTF(((__String *)(dictionary->objectForKey(
"play"
)))->getCString(),
3
"font/DFPShaoNvW5-GB.ttf"
,40);
4
playText->setColor(Color3B(100,100,100));
5
auto playMenu = MenuItemLabel::create(playText,CC_CALLBACK_1(StartGame::play,
this
));
6
7
//添加分数榜按钮
8
auto scoreText = Label::createWithTTF(((__String *)(dictionary->objectForKey(
"scoreMenu"
)))->getCString(),
9
"font/DFPShaoNvW5-GB.ttf"
,40);
10
scoreText->setColor(Color3B(100,100,100));
11
auto scoreMenu = MenuItemLabel::create(scoreText,CC_CALLBACK_1(StartGame::scoreScene,
this
));
12
13
//添加关于作者菜单
14
auto authorText = Label::createWithTTF(((__String *)(dictionary->objectForKey(
"aboutMe"
)))->getCString(),
15
"font/DFPShaoNvW5-GB.ttf"
,40);
16
authorText->setColor(Color3B(100,100,100));
17
auto authorMenu = MenuItemLabel::create(authorText,CC_CALLBACK_1(StartGame::aboutMe,
this
));
18
19
auto menu = Menu::create(playMenu,scoreMenu,authorMenu,NULL);
20
menu->alignItemsVerticallyWithPadding(30);
21
menu->setPosition(size.width/2,size.height*0.3);
22
this
->addChild(menu);
23
//分数榜响应函数
24
void
StartGame::scoreScene(Ref * ref)
25
{
26
Director::getInstance()->pushScene(ScoreScene::createScene());
27
}




在移植的过程中遇到了一个小问题,提示fatal error: cocos-ext.h: No such file or d irectory,这是因为3.0扩展库是没有作为工程的一部分的,在win32下我们引入了工程extensions,才编译通过的,移植android的过程中,我们需要对mk文件做下修改。如图所示,然后移植,就成功了。





版权声明:本文由(
小塔 )原创,转载请保留文章出处!

本文链接:http://www.zaojiahua.com/score-rankings.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: