在遊戲開發中,一般會将一些遊戲的配置資訊儲存到csv檔案中,比如遊戲有多個關卡,每個關卡失敗之後的文案,分享的文案等等配置資訊,我們在程式中通常就要讀取csv檔案的内容,然後通過代碼解析檔案資料,最後封裝成一個類似二維數組的資料,裡面存放着csv行和列的資訊。
現在比如我們的res目錄下有個levelConfig.csv檔案,裡面的内容如下:
關卡,關卡類名,标題,簡介,勝利分享文案,失敗求助文案,提示1,提示2,提示3
level,className,title,desc,winShareWord,helpWord,tips1,tips2
1,關卡1,标題1,desc1,勝利分享1,求助文案1,提示1,提示2
2,關卡2,标題2,desc2,勝利分享2,求助文案2,提示1,提示2
我們來首先來擷取檔案裡面的内容。
function initLevelConfig(){
try{
cc.loader.loadTxt("res/levelConfig.csv",function(err,data){
if(err){cc.log(err);return;}
cc.log(data);
});
}catch(err){
cc.log("擷取關卡配置總表錯誤:"+err);
}
}
通過cc.loader.loadTxt方法,就能夠擷取到檔案裡面的内容了,不過擷取到的data是一串字元串,我們還必須将其解析,是以我們在這裡使用一個解析csv檔案的函數,将CSV轉換為Array
//CSV轉Array
function CSVToArray( strData, strDelimiter ) {
strDelimiter = (strDelimiter || ",");
var objPattern = new RegExp(
(
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
"([^\"\\" + strDelimiter + "\\r\\n]*))"
),
"gi"
);
var arrData = [[]];
var arrMatches = null;
while (arrMatches = objPattern.exec( strData )){
var strMatchedDelimiter = arrMatches[ 1 ];
if (
strMatchedDelimiter.length &&
(strMatchedDelimiter != strDelimiter)
){
arrData.push( [] );
}
if (arrMatches[ 2 ]){
var strMatchedValue = arrMatches[ 2 ].replace(
new RegExp( "\"\"", "g" ),
"\""
);
} else {
var strMatchedValue = arrMatches[ 3 ];
}
arrData[ arrData.length - 1 ].push( strMatchedValue );
}
return arrData;
}
我們使用這個方法,就能夠把scv的那一串内容轉換為一個二維數組,然後通過周遊這個二維數組,就能擷取到我們想要的資料了:
function initLevelConfig(){
try{
cc.loader.loadTxt("res/levelConfig.csv",function(err,data){
if(err){cc.log(err);return;}
//csv資料二維數組
var csvArray=CSVToArray(data,",");
for(var i= 2;i<=csvArray.length-1;i++){
//rowData表示一行的資料
var rowData=csvArray[i];
//一行有很多列,周遊,擷取每一列的内容
for(var j=0;j<rowData.length;j++){
//輸出i行j列資料
cc.log(csvArray[i][j]);
}
}
});
}catch(err){
cc.log("擷取關卡配置總表錯誤:"+err);
}
}
以下的方法是擷取csv檔案中指定行列對應的内容:
第一個參數是檔案内容,
第二個參數是分割标記,CSV檔案内容資料一般都是以逗号“,”分割的,預設為逗号“,“
第三個參數是行數
第四個參數是列數
function getStrByRowAndKeyFromCSV( strData, strDelimiter, row, key ) {
strDelimiter = (strDelimiter || ",");
var objPattern = new RegExp(
(
"(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
"([^\"\\" + strDelimiter + "\\r\\n]*))"
),
"gi"
);
var arrData = [[]];
var arrMatches = null;
while (arrMatches = objPattern.exec( strData )){
var strMatchedDelimiter = arrMatches[ 1 ];
if (
strMatchedDelimiter.length &&
(strMatchedDelimiter != strDelimiter)
){
arrData.push( [] );
}
if (arrMatches[ 2 ]){
var strMatchedValue = arrMatches[ 2 ].replace(
new RegExp( "\"\"", "g" ),
"\""
);
} else {
var strMatchedValue = arrMatches[ 3 ];
}
arrData[ arrData.length - 1 ].push( strMatchedValue );
}
for(var i = 0; i<arrData[1].length; i++){
if (arrData[1][i] == key){
return arrData[row+1][i]
}
}
return "";
}