cocos2d-x 3.4之熱門排行榜的實現,cocos2d-x3.4

來源:互聯網
上載者:User

cocos2d-x 3.4之熱門排行榜的實現,cocos2d-x3.4

***************************************轉載請註明出處:http://blog.csdn.net/lttree********************************************



~~~~五一假期啊~~~~



這個熱門排行榜,我搜過很多,

但至今都沒找到。。。


我就自己研究了下,

用TableView+UserDefault來實現,

其中還用到了 輸入文字框 CCTextFieldTTF,

可以實現儲存。


應該算是首發了~.~

先看一下,實際效果吧:


實驗品,所以介面有點渣渣。。。


現在來說下實現方法,
首先,要會用 UserDefault(不會的話,傳送門:  點我    )
然後,要會用TableView(不會的話,傳送門: click me  )
好了,廢話說了一堆 o(╯□╰)o


對熱門排行榜的實現,主要分為三部分:初始化、顯示、更新

***************************************************************轉載請註明出處:http://blog.csdn.net/lttree************************************************************************

1.初始化
先弄兩個文字框,作為輸入,
一個按鈕,作為提交成績,
一個TableView,展示熱門排行榜,
對於TableView那些擺放神馬的,就不多說,在源碼中看吧;


這裡,我用了一個結構體來儲存成績:

struct Player{std::string name;int score;};

剛開始,先判斷有沒有XML,

方法就是,從XML讀取一個BOOL(當然別的類型也行),
如果不存在,就建立XML,存在就直接擷取:

// 擷取資料if(!UD_getBool("isExist", false)){        UD_setBool("isExist",true);for( int i=1 ; i <= max_range ; i++ ){// 給 XML 相應內容賦值UD_setString(StringUtils::format("p%d_name",i).c_str(),"name");UD_setInt(StringUtils::format("p%d_score",i).c_str(),0);// 給數組相應內容賦值p[i-1].name = "name";p[i-1].score = 0;}    }else  {for( int i=1 ; i <= max_range ; i++ ){// 擷取 XML 內容p[i-1].name = UD_getString(StringUtils::format("p%d_name",i).c_str());p[i-1].score = UD_getInt(StringUtils::format("p%d_score",i).c_str());}}

這是初始化部分的內容。


***************************************************************轉載請註明出處:http://blog.csdn.net/lttree************************************************************************

2.顯示
所有資料,在數組內是根據分數排好序的(從高到低),
對於TableView的 cell 設定部分,根據每個cell的idx,來擷取相應結構體數組內容,
然後產生一個CCString,顯示出來:

//由於tableview是動態擷取資料的,該方法在初始化時會被調用一次,之後在每個隱藏的cell顯示出來的時候都會調用TableViewCell* RankList::tableCellAtIndex(TableView *table, ssize_t idx){CCString *string = CCString::create(p[idx].name+":"+StringUtils::format("%d",p[idx].score));    // 在重用隊列中擷取一個cell 然後判斷cell是否為空白 不為空白則建立一個新的    TableViewCell *cell = table->dequeueCell();        if (!cell) {//建立一個新的cell        cell = new TableViewCell();//加入到自動釋放池中        cell->autorelease();// 名稱LabelTTF *label = LabelTTF::create(string->getCString(), "Arial", 20.0);label->setPosition(Vec2::ZERO);label->setAnchorPoint(Vec2::ZERO);        label->setTag(100);        cell->addChild(label);    }    else    {        // 如果cell不為空白,則根據tag擷取到之前cell中存放的元素,並將元素資訊重設//擷取當前cell中的label        LabelTTF *label = (LabelTTF*)cell->getChildByTag(100);//重設label的相關資訊label->setString(string->getCString());    }          return cell;  }


***************************************************************轉載請註明出處:http://blog.csdn.net/lttree************************************************************************


3.更新
更新這裡,因為沒有遊戲來弄(太大),
所以就用 文字框輸入名稱與成績,然後按鈕提交進行重新整理來小小類比一下。


邏輯是醬紫的
> 先把文字框的內容添加到數組末尾
> 進行判斷,這個玩家是否已經在熱門排行榜中(避免一個玩家多個排名),如果在,並且成績高於之前成績,則重新整理成績;如果在,但成績低於之前成績,就不管了,也不會再佔一個名額,將其他玩家刷下去。
> 如果玩家不在熱門排行榜中,我們就進行一個排序(這裡資料量小,排序演算法任意,我用了最簡單的小冒泡)
> 儲存到XML中
就是這樣了:

void RankList::menuSubmitCallback(Ref* pSender){// 擷取提交的成績p[max_range].name=textEdit->getString();p[max_range].score=std::atoi(textEdit2->getString().c_str());bool isExist = false;// 玩家是否已經在熱門排行榜for( int i = 0 ;i < max_range ; i++ ){if( p[i].name == p[max_range].name ){p[i].score = p[i].score>p[max_range].score?p[i].score:p[max_range].score;isExist = true;break;}}if( !isExist ){// 排個序(冒泡)for(int i = 0 ; i < max_range ; i++ ){for( int j = max_range-i ; j > 0 ; j-- ){if( p[j].score > p[j-1].score ){Player temp;temp = p[j];p[j] = p[j-1];p[j-1] = temp;}}}}// 存入XMLfor( int i=1 ; i <= max_range ; i++ ){// 給 XML 相應內容賦值UD_setString(StringUtils::format("p%d_name",i).c_str(),p[i-1].name);UD_setInt(StringUtils::format("p%d_score",i).c_str(),p[i-1].score);}// 這裡,是用來測試的,忽略不計吧CCLOG(p[0].name.c_str());CCLOG("score:%d",p[0].score);CCLOG(p[1].name.c_str());CCLOG("score:%d",p[1].score);CCLOG(p[2].name.c_str());CCLOG("score:%d\n",p[2].score);}


***************************************************************轉載請註明出處:http://blog.csdn.net/lttree************************************************************************


4.一些問題
對於儲存問題
這裡用UserDefault儲存,是無法儲存數組的,
查API也能發現,
只有6種類型—— bool、int、float、double、string、data
所以,我這裡儲存方式,其實是一個偽數組方式(看起來像,但其實並非是)
儲存形式是這種:
key            value
p1_name   xxx 
p2_name   xxx
p3_name   xxx
p1_score   ...
p2_score   ...
p3_score   ...
只是,通過一個小技巧,讓儲存不至於那麼繁瑣,
而且還有可擴充性,或許現在可以一條一條寫,
但如果以後存10名玩家,那。。。
以setString來,是這樣實現的:

UD_setString(StringUtils::format("p%d_name",i).c_str(),p[i-1].name);


***************************************************************轉載請註明出處:http://blog.csdn.net/lttree************************************************************************


對於擴充問題
我這裡只是展示了3個名稱,
如果需要多幾個,比如10個,20個,
不需要改動太多,只需要在我設定的GameDefine.h 中的 max_range 改動即可。
但是,如果執行過一次,
再改動max_range(就是XML檔案已存在)
那剩下的就不會顯示,應該預設顯示的  name:0
而是  :0
就像這樣:



如果想要改動,預設的成績或者名稱,就在判斷有沒有XML檔案那裡:

// 給 XML 相應內容賦值UD_setString(StringUtils::format("p%d_name",i).c_str(),"name");UD_setInt(StringUtils::format("p%d_score",i).c_str(),0);


OK,就是這樣啦,

簡單的小熱門排行榜的實現,

介面太渣了,我都有些看不下去了。。。


本篇文章的代碼 ->這裡 





***************************************轉載請註明出處:http://blog.csdn.net/lttree********************************************

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.