您好,登錄后才能下訂單哦!
【嘮叨】
游戲中其實不需要什么復雜的文件讀寫操作。
而FileUtils類主要的功能:設置加載、保存文件的所在路徑。
內容結構:
1、文件讀取
getDataFromFile、getStringFromFile、getFileDataFromZip
2、文件查找
文件字典(Dictionary)、搜索路徑(SearchPaths)、子區分路徑(SearchResolutionsOrder)
fullPathForFilename、fullPathFromRelativeFile
3、文件判斷
isFileExist、isAbsolutePath、PopupNotify
4、文件寫入
getWritablePath、UserDefault、RenderTexture
5、文件查找的應用
舉例:精靈的創建
【FileUtils】
0、獲取單例對象
FileUtils也是一個單例類,可以通過getInstance()來獲取單例對象。
// static FileUtils* getInstance(); //獲得單例對象 static void destroyInstance(); //釋放單例對象資源 virtual void purgeCachedEntries(); //清理文件查找緩存 //
1、文件讀取
> getDataFromFile
> getStringFromFile
> getFileDataFromZip
// //讀取文件內容. virtual Data getDataFromFile(const std::string& filename); //數據. 返回: data virtual std::string getStringFromFile(const std::string& filename); //數據內容. 返回: data.getBytes() //讀取zip中某資源文件的內容 // [in] zip文件路徑 , 相對zip的文件路徑 // [out] size. 若文件讀取成功,這個值為數據大小,否則為零 // 如果成功,則返回數據指針,否則返回 nullptr. virtual unsigned char* getFileDataFromZip(const std::string& zipFilePath, const std::string& filename, ssize_t *size); //
2、文件查找
2.1、設置文件查找路徑
> 文件字典 (Dictionary)
> 搜索路徑 (SearchPaths)
> 子區分路徑(SearchResolutionsOrder)
具體用法見下面的 2.3 。
// //設置文件詞典. 相當于給文件起別名 //map["sprite.png"] = "sp.png" virtual void setFilenameLookupDictionary(const ValueMap& filenameLookupDict); virtual void loadFilenameLookupDictionaryFromFile(const std::string &filename); //plist加載文件詞典 //設置搜索路徑(可以是絕對路徑、相對路徑) virtual void setSearchPaths(const std::vector<std::string>& searchPaths); //清除之前add的全部搜索路徑(除了默認路徑"Resources") void addSearchPath(const std::string & path, const bool front=false); virtual const std::vector<std::string>& getSearchPaths() const; //設置子區分路徑 virtual void setSearchResolutionsOrder(const std::vector<std::string>& searchResolutionsOrder); //清除之前add的全部子區分路徑 virtual void addSearchResolutionsOrder(const std::string &order,const bool front=false); virtual const std::vector<std::string>& getSearchResolutionsOrder(); //
2.2、查找文件
> fullPathForFilename
> fullPathFromRelativeFile
當然查找之前,先判斷filename是否存在文件字典,若有將替換。
// //獲取文件的完整路徑(絕對路徑) //注意: 查找的是文件 , 而不是文件夾 virtual std::string fullPathForFilename(const std::string &filename); //路徑拼接 //relativeFile.substr(0, relativeFile.rfind('/')+1) + getNewFilename(filename); virtual std::string fullPathFromRelativeFile(const std::string &filename, const std::string &relativeFile); //
請注意fullPathFromRelativeFile的用法:
(1)保留relativeFile最后一個'/'前面的路徑(如:"xyz/123") (2)通過文件字典替換filename(如:"sprite.png" -> "sp.png") (3)路徑拼接:"xyz/sp.png" (4)若relativeFile = "xyz/123/",則路徑拼接:"xyz/123/sp.png" |
2.3、舉例
// map["sprite.png"] = "bg.png"; void setFilenameLookupDictionary(map); //設置字典 void setSearchPaths("C:/Res/xyz", "xyz"); //設置搜索路徑 void setSearchResolutionsOrder("1", "2"); //設置子區分路徑 std::string fullPathForFilename("sprite.png"); //獲取完整路徑 //
查找過程:
查找 "sprite.png"
(1)先根據字典替換別名 "sprite.png" --> "bg.png"
(2)然后查找"bg.png"(若無字典,直接查找"sprite.png")
(3)按以下順序查找,并返回"sprite.png"的完整路徑(如"C:/Res/xyz/bg.png")。
(4)若未找到,返回"sprite.png"
C:/Res/xyz/1/bg.png C:/Res/xyz/2/bg.png C:/Res/xyz/bg.png C:/projects/MyGame/Resources/xyz/1/bg.png C:/projects/MyGame/Resources/xyz/2/bg.png C:/projects/MyGame/Resources/xyz/bg.png C:/projects/MyGame/Resources/1/bg.png C:/projects/MyGame/Resources/2/bg.png C:/projects/MyGame/Resources/bg.png 注意:若找不到"bg.png"。即使"C:/Res/xyz/"路徑下存在"sprite.png",也顯示找不到。 |
3、文件判斷
> isFileExist
> isAbsolutePath
> PopupNotify
// //檢查文件是否存在(相對路徑、絕對路徑,都可以) virtual bool isFileExist(const std::string& filename) const; //檢查路徑是不是絕對路徑 //在Android平臺上,若path是相對于"assets/",該方法會把它當成絕對路徑true virtual bool isAbsolutePath(const std::string& path) const; //設置圖片加載失敗時,是否彈出消息框 virtual void setPopupNotify(bool notify); virtual bool isPopupNotify(); //
4、文件寫入
4.1、獲取寫入路徑
寫入路徑一般無法修改。
// virtual std::string getWritablePath() const = 0; //
不同的平臺,文件寫入的路徑不同,如:
> Win32 :在exe文件所在的目錄。(如“proj.win32/Debug.win32/”)
> Andriod:"/data/data" 目錄。
> IOS :"document folder" 目錄。
4.2、寫入文件的方法
可以通過以下兩個類來保存游戲的數據:
> UserDefault :用于保存游戲中的用戶數據。
> RenderTexture:用于保存游戲中創建的圖片數據。
具體操作,請學習UserDefault、RenderTexture兩個類。
5、文件查找的應用(精靈的創建)
精靈的創建需要一張圖片資源,而圖片資源是從哪里來的呢?
> 創建sprite的過程中,首先會調用fullPathForFilename("sprite.png")。
> 先查找圖片所在路徑,然后根據圖片來創建sprite精靈。
如果不設置文件查找的路徑的話,Win32項目默認會在"Resources"中查找圖片,而Android項目默認會在"assets"中查找資源圖片。
在這里還是通過 2.3 中的例子分析:
// map["sprite.png"] = "bg.png"; void setFilenameLookupDictionary(map); //設置字典 void setSearchPaths("C:/Res/xyz", "xyz"); //設置搜索路徑 void setSearchResolutionsOrder("1", "2"); //設置子區分路徑 Sprite* sp = Sprite::create("sprite.png"); //創建精靈 //
查找過程:
查找 "sprite.png"
(0)調用fullPathForFilename("sprite.png"),查找圖片所在路徑。
(1)先根據字典替換別名 "sprite.png" --> "bg.png"
(2)然后查找"bg.png"(若無字典,直接查找"sprite.png")
(3)按以下順序查找,并返回"sprite.png"的完整路徑(如"C:/Res/xyz/bg.png")。
(4)若未找到"bg.png",繼續查找"sprite.png"。
(5)若依舊還未找到"sprite.png",報錯。
(6)若找到圖片所在路徑,則用該圖片創建sprite精靈。
C:/Res/xyz/1/bg.png C:/Res/xyz/2/bg.png C:/Res/xyz/bg.png C:/projects/MyGame/Resources/xyz/1/bg.png C:/projects/MyGame/Resources/xyz/2/bg.png C:/projects/MyGame/Resources/xyz/bg.png C:/projects/MyGame/Resources/1/bg.png C:/projects/MyGame/Resources/2/bg.png C:/projects/MyGame/Resources/bg.png C:/Res/xyz/1/sprite.png C:/Res/xyz/2/sprite.png C:/Res/xyz/sprite.png C:/projects/MyGame/Resources/xyz/1/sprite.png C:/projects/MyGame/Resources/xyz/2/sprite.png C:/projects/MyGame/Resources/xyz/sprite.png C:/projects/MyGame/Resources/1/sprite.png C:/projects/MyGame/Resources/2/sprite.png C:/projects/MyGame/Resources/sprite.png 注意:如果"C:/Res/xyz/"路徑同時存在"bg.png"和"sprite.png"。 那么創建的精靈所使用的資源圖片為"bg.png",而不是"sprite.png"。 |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。