使用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,这里需要注意一下,因为本人就是没有注意这个参数的类型导致出现了莫名其妙的错误,好了,代码如下。
然后在开始游戏的场景中添加几个菜单用来选择进入分数榜的场景,代码如下。
在移植的过程中遇到了一个小问题,提示fatal error: cocos-ext.h: No such file or d irectory,这是因为3.0扩展库是没有作为工程的一部分的,在win32下我们引入了工程extensions,才编译通过的,移植android的过程中,我们需要对mk文件做下修改。如图所示,然后移植,就成功了。
版权声明:本文由(
小塔 )原创,转载请保留文章出处!
本文链接:http://www.zaojiahua.com/score-rankings.html
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
相关文章推荐
- 使用3.0实现微信打飞机——4.添加敌机
- 使用3.0实现微信打飞机——9.通过截屏实现暂停功能
- 使用3.0实现微信打飞机——6.碰撞检测
- 使用3.0实现微信打飞机——7.贝塞尔曲线和添加UFO
- 使用3.0实现微信打飞机——12.游戏结束场景
- 使用3.0实现微信打飞机——2.滚动地图
- 使用3.0实现微信打飞机——8.改变玩家技能
- 使用3.0实现微信打飞机——14.终结篇
- 使用3.0实现微信打飞机——13.添加声音
- 使用3.0实现微信打飞机——5.添加子弹及管理器
- 使用3.0实现微信打飞机——3.添加玩家飞机
- 使用3.0实现微信打飞机——1.游戏开始场景
- 使用3.0实现微信打飞机——10.用户数据的操作
- ASP.NET jQuery 食谱11 (通过使用jQuery validation插件简单实现用户登录页面验证功能)
- ASP.NET MVC 3.0(十九): MVC 3.0 实例之使用开源控件实现表格排序和分页
- java学习笔记11 - 使用forward实现API接口转发
- cocos2d-x 使用 CCScale9Sprite 实现微信对话框
- actionbar与viewpager的联合使用(android 3.0 ,level 11以上)
- actionbar与viewpager的联合使用(android 3.0 ,level 11以上)
- 使用Pygame制作微信打飞机游戏PC版