[cocos2d-x] CCFileUtils でファイルを読み込む

cocos2d-x

さいしょは、CCApplication_ios.mm に Objective-C のコードを書いてファイルを取得してたんだけど、

なんかダメダメな感じがしたのでたぶんCCFileUtilsを使うんだなということをおもむろに理解した。

ということで使おうと思ったけど日本語のリファレンスが見つからないのでテキトーに一部を和訳した。

CCFileUtils.h

    /**
    @brief Get resource file data
    @param[in]  pszFileName The resource file name which contain the path
    @param[in]  pszMode The read mode of the file
    @param[out] pSize If get the file data succeed the it will be the data size,or it will be 0
    @return if success,the pointer of data will be returned,or NULL is returned
    @warning If you get the file data succeed,you must delete it after used.
    */
    static unsigned char* getFileData(const char* pszFileName, const char* pszMode, unsigned long * pSize);

@brief 手軽にファイルリソースをゲットできるよ!

@param pszFileName パスを含めたファイル名の char文字列

@param pszMode ファイルの読み込みモード char文字列

"r" は テキストモードでの読み込み : テキストファイルの取得

"rb" は バイナリモードで読み込み : 画像リソースの取得など

@param pSize 読み込むデータの長さ。デフォルトは0

@return 読み込み成功したらデータへのポインタを返すよ

@warning ファイルデータはキャッチアンドリリースが原則

    /**
    @brief Get resource file data from zip file
    @param[in]  pszFileName The resource file name which contain the relative path of zip file
    @param[out] pSize If get the file data succeed the it will be the data size,or it will be 0
    @return if success,the pointer of data will be returned,or NULL is returned
    @warning If you get the file data succeed,you must delete it after used.
    */
    static unsigned char* getFileDataFromZip(const char* pszZipFilePath, const char* pszFileName, unsigned long * pSize);

@brief zip ファイルからお手軽にリソースデータを取得できるよ

@以下は getFileData と同様

    /** removes the HD suffix from a path
    @returns const char * without the HD suffix
    @since v0.99.5
    */
    static std::string& ccRemoveHDSuffixFromFile(std::string& path);

HD suffixってなんだろうとおもってググったら

cocos2d for iPhone(Ver. 0.99.5)でRetinaディスプレイ対応 - CaptainShadowの日記

に解説があった。

    /**
    @brief   Generate the absolute path of the file.
    @param   pszRelativePath     The relative path of the file.
    @return  The absolute path of the file.
    @warning We only add the ResourcePath before the relative path of the file.
    If you have not set the ResourcePath,the function add "/NEWPLUS/TDA_DATA/UserData/" as default.
    You can set ResourcePath by function void setResourcePath(const char *pszResourcePath);
    */
    static const char* fullPathFromRelativePath(const char *pszRelativePath);

    /// @cond
    static const char* fullPathFromRelativeFile(const char *pszFilename, const char *pszRelativeFile);
    /// @endcond

これ以降は読んでない。

    /**
    @brief  Set the ResourcePath,we will find resource in this path
    @param pszResourcePath  The absolute resource path
	@warning Don't call this function in android and iOS, it has not effect.
	In android, if you want to read file other than apk, you shoud use invoke getFileData(), and pass the 
	absolute path.
    */
    static void setResourcePath(const char *pszResourcePath);
    /**
    @brief   Generate a CCDictionary pointer by file
    @param   pFileName  The file name of *.plist file
    @return  The CCDictionary pointer generated from the file
    */
    static CCDictionary<std::string, CCObject*> *dictionaryWithContentsOfFile(const char *pFileName);
	/*
	@brief The same meaning as dictionaryWithContentsOfFile(), but it doesn't call autorelease, so the
	       invoker should call release().
	*/
	static CCDictionary<std::string, CCObject*> *dictionaryWithContentsOfFileThreadSafe(const char *pFileName);
	/**
	@brief   Get the writeable path
	@return  The path that can write/read file
	*/
	static std::string getWriteablePath();
    /**
    @brief Set/Get whether pop-up a message box when the image load failed
    */
    static void setIsPopupNotify(bool bNotify);
    static bool getIsPopupNotify();

テキストファイルを読み込む方法

途中で気づいたけど、

CCTexture2D * CCTextureCache::addImage(const char * path) の処理を

読んでいけばなんとなく使い方がわかってしまった。

たとえばテキストファイルを読み込むならこれでいい

  // 例えばテキストファイルを読み込むならば
  const char* path = "相対ファイルパス";
  std::string fullpath = CCFileUtils::fullPathFromRelativePath(path);
  CCFileData *data = new CCFileData(fullpath.c_str(), "r");
  unsigned long nSize  = data->getSize();
  unsigned char* pBuffer = data->getBuffer();

  // 読み込んだテキストの文字列データ
  std::string* pLoadedString = new std::string((const char *)pBuffer, nSize);
  delete data;
Share