cocos2dx遊戲開發學習——CSV檔案解析
在cocos2dx專案中,我們經常會用到CSV檔案。這裡直接上程式碼。
ALCsvUtil.h
/**
* CSV 解析工具
*/
#ifndef ALCsvUtil_h
#define ALCsvUtil_h
#include <vector>
#include <map>
#include <string>
typedef std::vector<std::string> StrVec;
typedef std::vector< StrVec > StrDict;
typedef std::map< std::string, StrDict> CsvMap;
class ALCsvUtil
{
public :
static ALCsvUtil* getInstance();
static void destroyInstance();
/**
* add csv file to dict
*
* @param sPath is csv file path
*/
virtual bool addFileData(const std::string &rSCsvFilePath);
/**
* del csv file to dict
*
* @param sPath is csv file path
*/
virtual void releaseFile(const std::string &rSCsvFilePath);
/**
* get some row and some column value from some csv file
*
* @param rRow is row num
* @param rCol is column num
* @param csvFilePath is some csv file
*
* @return some row and some column real TextValue IntValue, DoubleValue,if this pos not be exsit return ""
*/
virtual std::string getText(const int &rRow, const int &rCol, const std::string &rSCsvFilePath);
virtual int getInt(const int &rRow, const int &rCol, const std::string &rSCsvFilePath);
virtual double getDouble(const int &rRow, const int &rCol, const std::string &rSCsvFilePath);
/**
* get some file row data
*
* @param iRow is row num
* @param rSCsvFilePath is some csv file
*
* @return some row data
*/
virtual StrVec getRowData(const int &rIRow, const std::string &rSCsvFilePath);
/**
* get csv file row and column save tuple<int, int>
*
* @param rSCsvFilePath csv file path
*
* @return csv file row, column in tuple<int, int>
*/
virtual std::tuple<int, int> getFileRowColNum(const std::string &rSCsvFilePath);
/**
* find dest value in csv file row num
*
* @param rSValue find value
* @param rIValueCol value column
* @param rSCsvFilePath csv file path
*
* @return value in csv row
*/
virtual int findValueInWithLine(const std::string &rSValue, const int &rIValueCol, const std::string &rSCsvFilePath);
protected:
/**
* get csv file string vec
*
* @param rSCsvFilePath csv file path
*
* @return csv file strVec
*/
virtual StrDict &getFileDict(const std::string &rSCsvFilePath);
virtual ~ALCsvUtil();
/**
* get csv file string vec
*
* @param rSCsvFilePath csv file path
*
* @return csv file strVec
*/
/**
get string vec by split
@param rSSrcStr content
@param rSSep Seperator
@return std::vector<std::string>
*/
StrVec split(const std::string &rSSrcStr, const char &rSSep);
private:
ALCsvUtil();
ALCsvUtil(const ALCsvUtil &rCsvUtil) = delete;
ALCsvUtil &operator=(const ALCsvUtil &rCsvUtil) = delete;
private:
static ALCsvUtil* _gInstance;
CsvMap* _pCsvMap;
};
#endif /* ALCsvUtil_h */
ALCsvUtil.cpp
//
// ALCsvUtil.cpp
// GameTest-mobile
//
// Created by Allen on 2018/7/2.
//
#include "ALCsvUtil.h"
ALCsvUtil* ALCsvUtil::_gInstance;
ALCsvUtil::ALCsvUtil():_pCsvMap(nullptr)
{
_pCsvMap = new CsvMap();
}
ALCsvUtil::~ALCsvUtil()
{
CC_SAFE_DELETE(_pCsvMap);
}
ALCsvUtil* ALCsvUtil::getInstance()
{
if (!_gInstance) {
_gInstance = new ALCsvUtil();
}
return _gInstance;
}
void ALCsvUtil::destroyInstance()
{
if (_gInstance) {
CC_SAFE_DELETE(_gInstance);
}
}
bool ALCsvUtil::addFileData(const std::string &rSCsvFilePath)
{
if (std::string("") == rSCsvFilePath) return false;
if (!cocos2d::FileUtils::getInstance()->isFileExist(rSCsvFilePath)) {
CCLOG("ALCsvUtil::addFileData(): %s file could not be found",rSCsvFilePath.c_str());
return false;
}
cocos2d::Data csvData = cocos2d::FileUtils::getInstance()->getDataFromFile(rSCsvFilePath);
if (!csvData.getBytes()) {
CCLOG("ALCsvUtil::addFileData(): %s file is null",rSCsvFilePath.c_str());
return false;
}
StrVec linesVec = split((char*)csvData.getBytes(), '\n');
StrVec strsVec;
StrDict dict;
for (const auto &linesVecIter :linesVec) {
std::string lineStr(linesVecIter);
if (lineStr[lineStr.length() - 1] == '\r') {
lineStr = lineStr.substr(0,lineStr.length() - 1);
}
strsVec = split(lineStr, ',');
dict.push_back(strsVec);
}
_pCsvMap->insert(std::make_pair(std::string(rSCsvFilePath), dict));
return true;
}
void ALCsvUtil::releaseFile(const std::string &rSCsvFilePath)
{
_pCsvMap->erase(rSCsvFilePath);
}
std::tuple<int,int> ALCsvUtil::getFileRowColNum(const std::string &rSCsvFilePath)
{
auto dict = getFileDict(rSCsvFilePath);
int rowNum = (int) dict.size();
int colNum = (int) (*(dict.begin())).size();
return std::make_tuple(colNum,rowNum-1);
}
std::string ALCsvUtil::getText(const int &rRow, const int &rCol, const std::string &rSCsvFilePath)
{
const auto dict = getFileDict(rSCsvFilePath);
CCASSERT(rRow < dict.size() && rCol < dict.at(rRow).size(), "ALCsvUtil: (row or col) out of range in getObjectAtIndex() ");
return dict.at(rRow).at(rCol);
}
int ALCsvUtil::getInt(const int &rRow, const int &rCol, const std::string &rSCsvFilePath)
{
return atoi(getText(rRow, rCol, rSCsvFilePath).c_str());
}
double ALCsvUtil::getDouble(const int &rRow, const int &rCol, const std::string &rSCsvFilePath)
{
return atof(getText(rRow, rCol, rSCsvFilePath).c_str());
}
StrVec ALCsvUtil::getRowData(const int &rIRow, const std::string &rSCsvFilePath)
{
auto tRow = std::get<1>(getFileRowColNum(rSCsvFilePath));
if(rIRow > tRow) return StrVec();
return _pCsvMap->at(rSCsvFilePath).at(rIRow);
}
StrDict &ALCsvUtil::getFileDict(const std::string &rSCsvFilePath)
{
CCASSERT((_pCsvMap->end() != _pCsvMap->find(rSCsvFilePath) || addFileData(rSCsvFilePath)),"ALCsvUtil: load csvFile file");
return _pCsvMap->at(rSCsvFilePath);
}
int ALCsvUtil::findValueInWithLine(const std::string &rSValue, const int &rIValueCol, const std::string &rSCsvFilePath)
{
auto iRowCount = std::get<1>(getFileRowColNum(rSCsvFilePath));
auto ret = -1;
std::string findValue(rSValue);
for (int iRow = 0; iRow < iRowCount; ++iRow)
{
std::string tmpValue = getText(iRow, rIValueCol, rSCsvFilePath);
if (findValue == tmpValue)
{
ret = iRow;
break;
}
}
return ret;
}
StrVec ALCsvUtil::split(const std::string &rSSrcStr, const char &rSSep)
{
StrVec strList;
std::string::size_type lastIndex = rSSrcStr.find_first_not_of(rSSep,0);
std::string::size_type currentIndex = rSSrcStr.find_first_of(rSSep,lastIndex);
while (std::string::npos != currentIndex || std::string::npos != lastIndex)
{
strList.push_back(rSSrcStr.substr(lastIndex,currentIndex - lastIndex));
lastIndex = rSSrcStr.find_first_not_of(rSSep,currentIndex);
currentIndex = rSSrcStr.find_first_of(rSSep,lastIndex);
}
return strList;
}
相關推薦
cocos2dx遊戲開發學習——CSV檔案解析
在cocos2dx專案中,我們經常會用到CSV檔案。這裡直接上程式碼。 ALCsvUtil.h /** * CSV 解析工具 */ #ifndef ALCsvUtil_h #define ALCsvUtil_h #include <vect
cocos2dx遊戲開發學習第一篇
畢業做開發,一年多的學徒級別,現在想學習一下cocos2dx引擎的遊戲開發,看了很多書上面關於環境搭建的問題,暈乎乎的,反正我到現在沒弄明白,今天下午看到一個部落格http://blog.sina.com.cn/s/blog_47021dd40101iki0.html,
遊戲開發學習筆記三
nor scrip 筆記 nsrunloop posit ppr 遊戲開發 tor http sdk%E6%9B%B4%E6%96%B0%E4%B8%8D%E6%88%90%E5%8A%9F%E6%B1%82%E5%A4%A7%E7%A5%9E%E5%B8%AE%E5%BF
SSM整合開發之CSV檔案匯入匯出實戰-鍾林森-專題視訊課程
SSM整合開發之CSV檔案匯入匯出實戰—65人已學習 課程介紹 本課程將給大家分享如何基於SSM實現CSV檔案的匯入匯出,並講解目前企業級JavaWeb應用mvc三層模式的開發流程,
cocos2dx遊戲開發加速度計
在cocos2d-x引擎中 使用了類CCAccelerometer來儲存加速度計的資訊 類CCAccelerometer的作用和使用者操作的分發器類似 區別在於使用者操作的分發器可以擁有很多委託物件 而加速度計只存在一個委託物件 這是因為一個移動裝置只有一個硬體 所以介面進行了簡化 CCAccel
2019版Unity3d遊戲開發學習指南
如今遊戲越來越火熱,讓人覺得好玩的同時,也不禁想自己動手做遊戲開發,那麼如何做遊戲開發,做遊戲開發又需要哪些技術呢?Unity3d遊戲開發入門難不難?2019版Unity3d遊戲開發學習指南,你值得擁有。遊戲開發需要懂幾種語言?基礎語言C/C++,這個是必選項。要提高效率,就還得會點組合語言。一些東西需要重複
2019版unity遊戲開發學習路線
Unity類似於Director,Blender game engine, Virtools 或 Torque Game Builder等,利用互動的圖型化開發環境為首要方式的軟體其編輯器執行Windows 和Mac OS X下,可釋出遊戲至Windows、Mac、Wii、iPhone、Windows pho
R語言開發之CSV檔案的讀寫操作了解下
在R中,我們可以從儲存在R環境外部的檔案讀取資料,還可以將資料寫入由作業系統儲存和訪問的檔案。這個csv檔案應該存在於當前工作目錄中,以方便R可以讀取它, 當然,也可以設定自己的目錄,並從那裡讀取檔案。
杭州unity3d手機遊戲開發學習資料
unity,也稱unity3d,是近幾年非常流行的一個3d遊戲開發引擎,跨平臺能力強,使用它開發的手機遊戲數不勝數。unity3d手機遊戲開發學習資料免費送給你吧,希望你會喜歡。 在這裡,我想給你推薦一本書,是《unity3d手機遊戲開發》。這本書通過三個部分循序漸進地介紹了unity在遊戲
使用nodejs解析xlsx、csv檔案轉換成JSON檔案詳細教程(含解決解析xlsx、csv檔案解析中文亂碼問題)
前言 最近工作中需要,領導給我一個csv檔案,讓我轉為JSON格式的檔案,決定使用nodejs來搞定,個人覺得這是用過的最簡單的方式;即使你沒用過node也可以通過本教程完成實現。你可能沒見過比這再詳細的教程文章了。可以收藏、轉載(轉載註明出處即可,不用與本人聯絡,大家分享學習,共同進步
iOS-解析讀取CSV檔案,解析excel檔案
專案中可能會遇到資料庫中匯出CSV格式資料,類似於如下圖: 需要將csv資料匯入程序序中使用,或者寫入本地資料庫檔案中. *什麼是CSV? CSV,即逗號分隔值(Comma-Separ
遊戲開發學習筆記(七)開發揹包系統
思路: Bag:管理揹包裡的格子 BagItemGrid:管理格子儲存物品的資訊(id及num) BagItem:管理物品拖拽功能及物品物品的更新顯示 Bag:管理揹包裡的格子 建立UI,Bag_item 和Bag_item_grid的Prefab, Bag新增Bag指令碼
android遊戲開發學習筆之九 (學習書籍 Android遊戲程式設計之從零開始)
/** * 矩形碰撞 * * @time 上午11:29:26 * @author retacn yue * @Email [email protected] */ @SuppressWarnings("unused") public class R
遊戲開發學習路線(需要學什麼)
遊戲開發需要學什麼(學習路線圖分享)?相信這是很多準備入行的同學都想了解的問題。那麼首先我們要先了解什麼是遊戲開發。中小型遊戲大致可分為網頁遊戲,flash遊戲,小遊戲等,基本上都是一些休閒類的傻呆萌的情節和操作,這類遊戲開發相對比較簡單,會Javascript、HTML、flashcs、Java就可以進行開
北京遊戲開發學習路線:花多少錢才能成為遊戲開發?
對於很多同學,尤其是剛畢業的同學來說,學習是一件需要投入大量金錢的事情。因為囊中羞澀,他們更關注的是學費,擔心負擔不起。那麼,我們不如來看看遊戲開發學費多少。目前來看,很多正規靠譜的遊戲開發公司,都考慮到了應屆生可能面臨的學費難題,都會推出先就業後交費的政策,這就大大方便了同學們的學習,這樣就不需要擔心太多問
關於Cocos2d-x遊戲開發學習過程的一個總結
首先,關於Cocos2d-x專案的建立: 1.需要在Cocos2d-x的下載解壓目錄下建立工程(以下簡稱cc) 例如:D:\cocos2d-x-2.2.6,找到該檔案下的tools資料夾下的project-creator中的專案建立批處理檔案。工程名為專案名稱,自定義
opengl es3.0遊戲開發學習筆記1-繪製旋轉的三角形
前段時間一直在看opengl es2.0遊戲開發的知識 ,這幾天買了本opengl es3.0遊戲開發的書 打算一邊學習一邊整理學習筆記,我的開發環境是Android studio 2.1.3,不過有個問題是Android studio自帶的模擬器只能支援es2
【COCOS2DX-遊戲開發之三一】之 座標系(下) convertToNodeSpace和convertToWorldSpace
遊戲中經常會用到一些變換: 遊戲中武器和角色在一個layer上,為了效率,會考慮將bullet, effect和 PhysicsParticle分別放到不用的層上,對應的層上使用batchnode來提高效率 武器和PhysicsParticleLauncher(粒子發射器)
適合小白的遊戲開發學習路線圖
ges 崗位 ado 後悔 了解 1年 目前 需求 sha 做遊戲開發要學什麽?適合小白的遊戲開發學習路線圖分享給正在自學,或者是準備自學的你。如果你想日後在這個行業裏成為真正的高手,那就真的需要去下一番苦心,不管你大學裏數學學得好不好,你掛了多少門,一定要學好3D數學,這
【Unity 3D遊戲開發學習筆記】實現太陽系
目標: 寫一個程式,實現一個完整的太陽系, 其他星球圍繞太陽的轉速必須不一樣,且不在一個法平面上。 基本思路是在裡面建立物件,架構成一個太陽系,sun作為父物件,其他行星作為子物件,並且相對sun的初始位置均不一樣,那麼角速度相同的情況下轉速就不一樣了,另外