1. 程式人生 > >Cocos2d-x 3.x中讀取csv資料檔案

Cocos2d-x 3.x中讀取csv資料檔案

遊戲開發中,資料檔案通常是儲存在xml,json,csv等格式的檔案中,這裡實現了CSV檔案的解析。 1.為什麼是CSV?    資料檔案為什麼儲存在CSV檔案中呢?    a,同樣的資料放到CSV中要比放在xml和json中要小。    b,CSV的解析也比較簡單。    c.策劃編輯方便,策劃比較擅長使用excel,使用CSV能夠使用excel直接匯出,不用再解析為其他格式。 2.解析思路:    用類似NotePad++類的軟體開啟CSV,會發現CSV的資料其實是一行一行的,每一行就代表了一條資料。那麼,我們就需要將CSV資料檔案 解析為一行一行的就好了。 3.一個小Demo TestCSV.h
#ifndef _TSXT_CSV_H_
#define _TSXT_CSV_H_

#include "cocos2d.h"
#include "../self/SF.h"

class TestCSV : public cocos2d:: Ref

{
public :
         static const char * FILE_NAME ;
         static cocos2d :: Vector< TestCSV *> s_textCSVVec ;
         static bool initStatic();
         static void finalizeStatic();
public :
         TestCSV ();
         ~ TestCSV();
         virtual bool init( std :: map< std :: string , std:: string > row );
private :
         CC_SYNTHESIZE_READONLY (int ,m_idx , Index);
         CC_SYNTHESIZE_READONLY ( std:: string , m_name, Name );
         CC_SYNTHESIZE_READONLY ( std:: string , m_value, Value );
};
#endif

TestCSV.cpp
#include "TestCSV.h"
USING_NS_CC ;
const char * TestCSV :: FILE_NAME = "test_csv.csv" ;
cocos2d :: Vector< TestCSV *> TestCSV ::s_textCSVVec ;
bool TestCSV :: initStatic()
{
         std :: string data = SFUtils:: getFileData (FILE_NAME );
         IF_NULL_RETURN_FALSE (data . c_str());
         /*CSV格式的檔案每一行最後都是\n\r,所以,可以根據其來將每一行分開*/
         std :: vector< std :: string> strVec = SFUtils :: splitString( data , "\r" );
         /*dataVec用來儲存所有行的資訊,每個資訊都是成對兒出現的map<key:string,value:string>
        這裡的key即ID,name等
        */
         std :: vector< std :: map< std :: string, std:: string > > dataVec ;
         /*解析第一行,第一行的資料將是後面行的key值*/
         std :: vector< std :: string> nameVec = SFUtils ::splitString ( strVec[ 0 ], "," );
         /*解析所有的行,並且新增的dataVec中*/
         for ( int i = 1 ; i < strVec. size (); i ++)
         {
                 std :: map< std :: string, std:: string > rowMap ;
                 std :: vector< std :: string> valueVec = SFUtils ::splitString ( strVec[ i ], "," );
                 for ( int j = 0 ; j < valueVec. size (); j ++)
                 {
                         rowMap . insert( std :: make_pair( nameVec [j ], valueVec [j ]));
                 }
                 dataVec . push_back( rowMap );
         }
         /*確保陣列中沒有資料*/
         s_textCSVVec .clear ();
         /*將資料轉換為資料物件*/
         for ( int i = 0 ; i < dataVec. size () - 1 ; i ++)
         {
                 TestCSV * pData = new ( std:: nothrow )TestCSV ();
                 if ( pData &&pData -> init( dataVec . at( i )))
                 {
                         s_textCSVVec .pushBack ( pData);
                 }
                 else
                 {
                         CC_SAFE_RELEASE (pData );
                 }
         }

         return true ;
}

void TestCSV :: finalizeStatic()
{
         s_textCSVVec .clear ();
}
TestCSV :: TestCSV()
         : m_idx(- 1 )
{}
TestCSV :: ~TestCSV ()
{}
bool TestCSV :: init( std :: map< std :: string, std:: string > row )
{
         /*解析資料*/
         m_idx = atoi( row ["ID" ]. c_str());
         m_name = row[ "name" ];
         m_value = row[ "value" ];
         return true ;
}

用到的其他方法:
std :: string SFUtils ::getFileData ( const char * pFileName)
{
         std :: string filePath = FileUtils :: getInstance()-> fullPathForFilename (pFileName );

         FileUtils ::getInstance ()-> setPopupNotify( false );
         ssize_t fileSize = 0 ;
         std :: string data = FileUtils :: getInstance()-> getStringFromFile (filePath . c_str());
         FileUtils ::getInstance ()-> setPopupNotify( true );

         return data ;
}
//字串拆分
std :: vector< std :: string> SFUtils:: splitString ( std:: string str , std :: string pattern )
{
         std :: string:: size_type pos ;
         std :: vector< std :: string> result;
         str += pattern;
         unsigned int size = str . size();
         for ( unsigned int i = 0 ; i < size ; i ++)
         {
                 pos = str. find (pattern , i );
                 if ( pos < size)
                 {
                         std :: string s = str. substr (i , pos - i );
                         result .push_back ( s);
                         i = pos + pattern . size() - 1 ;
                 }
         }
         return result ;
}
用到的資料:


相關推薦

Cocos2d-x 3.x讀取csv資料檔案

遊戲開發中,資料檔案通常是儲存在xml,json,csv等格式的檔案中,這裡實現了CSV檔案的解析。 1.為什麼是CSV?    資料檔案為什麼儲存在CSV檔案中呢?    a,同樣的資料放到CSV中要比放在xml和json中要小。    b,CSV的解析也比較簡單。  

Spark建立DataFrame和讀取CSV資料檔案

之前寫的程式中,有些API在Spark SQLContext沒有,我計算的結果先儲存在rdd中,最後在使用RDD轉換成dataframe進行儲存,話不多說下面是程式碼. //一個StruceFie

Cocos2d-x 3.0 物理碰撞檢測onContactBegin回調函數不響應問題

track 後來 which compare mar details egl def trac 好吧,事實上這篇也是暫時冒出來的,近期朋友要做個物理遊戲,曾經做物理還是用box2d,呃。確實要花些功夫才幹搞懂當中的精髓,可是聽講這套引擎又一次封裝了一次。要easy非

【玩轉cocos2d-x之四十】如何在Cocos2d-x 3.0使用opengl shader?

有小夥伴提出了這個問題,其實GLProgramCocos2d-x引擎自帶了。完全可以直接拿來用。先上圖吧。使用opengl前後的對比: 1.在cpp中使用openGL shader。 (1)新

cocos2d-x 3.2 XML讀取第二章(優化)

在第一章分別清晰的列出每一步的步驟,但這樣的程式碼冗餘,但XML多的時候,更是寫了N行程式碼,進行重構。 詳細:在init()中 tinyxml2::XMLDocument* homework = new tinyxml2::XMLDocument(); homewor

Cocos2d-x 3.0 物理碰撞檢測onContactBegin回撥函式不響應問題

好吧,其實這篇也是臨時冒出來的,最近朋友要做個物理遊戲,以前做物理還是用box2d,呃,確實要花些功夫才能搞懂其中的精髓,但是聽講這套引擎重新封裝了一次,要容易很多,所以就簡單嘗試了一下,感覺確實要簡單不少,不過在這其中還是遇到了些問題,首先就來說說onContactBeg

Cocos2d-x 3.x序列幀動畫

vector 序列幀 bash cpp ams with 序列 object -s Animation : 一個給精靈對象執行的幀動畫對象。 Animate:是將動畫包裝成動作的類。 AnimationCache:管理動畫的單例。 簡介 Animat

Cocos2d-x 3 X手遊開發例項詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

cocos2d-x 3.X eclipse gradle 多渠道多SDK打包配置教程(二)

根據上一篇的指導,應該已經可以出一個同資源同SDK的包了,現在看下在eclipse gradle下如何像Android studio一樣一鍵打出不同SDK接入的渠道包吧 首先一個專案一個專案的複製貼上到工程下,大概是這樣的 每個渠道都建立好build.gradle,裡

【 專欄 】- Cocos2d-x 3.x 圖形學渲染

Cocos2d-x 3.x 圖形學渲染 該專欄主要是介紹Cocos2d-x 3.x圖形學渲染技術講解,針對的是3D模型的材質渲染,幫助喜歡3D的開發者快速掌握該技術。。。。。

Python使用 pandas 來讀取csv資料

import pandas as pd daily_engagement = pd.read_csv('enrollments.csv') len(daily_engagement['account_k

Cocos2d-x 3.x 頭像選擇器,本地相簿與拍照+頭像編輯功能(Android、IOS雙平臺實現)

大連遊戲行業不是太發達,最後選擇在一家應用外包公司工作,在工作和業餘學習過程中積累了一點微不住道的經驗,希望分享給熱愛遊戲的小夥伴們。 在應用開發過程中會常常有使用者上傳頭像的功能,在網上找了N多資料發現沒有人具體介紹過該用cocos2d-x實現。這篇文章就來介紹一下如何在

cocos2d-x-3.x吞噬點選觸控事件

使用版本是 cocos2d-x-3.1.4 彈出對話方塊,有一個背景,吞噬觸控或者點選事件,使觸控或者點選事件不被傳遞下去,將addEventListenerWithSceneGraphPriority函式裡面的this改成當前layer就可以啦 //

cocos2d-x 3.x 學習與應用總結】4: 理解CC_CALLBACK_0, CC_CALLBACK_1, CC_CALLBACK_2, CC_CALLBACK_3

前言 得益於C++11的新特性,cocos 3.x版本在很多地方的程式碼看起來都優美了許多。這其中就包括一些回撥函式的寫法,CC_CALLBACK_N系列巨集的作用是對一個成員函式進行適配並返回一個回撥函式。本文介紹一下我對CC_CALLBACK_N系列巨集的

cocos2d-x 3.x BabeLua 外掛不能斷點除錯

cocos2d-x 3.x版本, exe 是執行檔案  src是指令碼資料夾 res是資原始檔夾 lua指令碼在src裡面,但是BabeLua設定的指令碼路徑沒有生效,導致找不到指令碼 後來在 AppDelegate.cpp裡面把src加到搜尋路徑下,就可以除錯得到了

cocos2d-x 3.x C++和Lua通訊方式:Lua堆疊正數索引和負數索引的關係和用法

   用cocos2d-x  編寫遊戲的過程中,我們很可能會用到Lua檔案。引用一本書上面的話,Lua最大的優勢在於,不用重新編譯專案就可以修改遊戲邏輯,大大縮減了開發程序。我用的是cocos2d-x

cocos2d-x 3.x遊戲開發學習筆記(1)--mac下配置cocos2d-x 3.x開發環境

原文:http://blog.csdn.net/likendsl/article/details/34617725 開啟使用者目錄下.bash_profile檔案,配置環境  [python] view plaincopyprint? vim ~/.b

009-UE4藍圖讀取CSV資料資料

Step1.使用Excel建立CSV檔案 表單內容如下: Step2.Ue4中建立名為TestData的結構體 結構體欄位如下(和表單保持一致): Step3.CVS檔案匯入UE4 指定資料表型

關於cocos2d-x 3.x Layer 與 Scene 錨點更改問題

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

用Android studio建立Cocos2d-x 3.X專案

如果你還在用eclipse那你就out了,Android Studio從1.3版開始支援對C++的編輯(雖然從目前來看用Android Studio來編輯C++還比較蛋疼)。而且Cocos2d-x從3.7版開始優化對android studio的支援,相信這一趨勢還會繼續。