程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> cocos2dx中加入unzip,cocos2dx加入unzip

cocos2dx中加入unzip,cocos2dx加入unzip

編輯:C++入門知識

cocos2dx中加入unzip,cocos2dx加入unzip


 作者:HU

 轉載請注明,原文鏈接:http://www.cnblogs.com/xioapingguo/p/4037323.html 

cocos2dx中沒有直接解壓文件的,自己網上找了個,記錄一下。

static unsigned long  _maxUnzipBufSize = 0x500000;
static bool unzip(const char *zipPath,const char *dirpath,const char *passwd)
{
    CCLOG("unzip fullpath =%s",zipPath);
    unzFile pFile = unzOpen(zipPath);
    if(!pFile)
    {
        return false;
    }
    int err = unzGoToFirstFile(pFile);
    bool ret = true;
    while (err == UNZ_OK)
    {
        int nRet = 0;
        int openRet = 0;
        do
        {
            if(passwd)
            {
                openRet = unzOpenCurrentFilePassword( pFile,passwd);
                CCLOG("openRet %d",openRet);
            }
            else
            {
                openRet = unzOpenCurrentFile(pFile);
            }
            CC_BREAK_IF(UNZ_OK != openRet);
            unz_file_info FileInfo;
            char szFilePathA[260];
            nRet = unzGetCurrentFileInfo(pFile, &FileInfo, szFilePathA, sizeof(szFilePathA), NULL, 0, NULL, 0);
            CC_BREAK_IF(UNZ_OK != nRet);
            //如果szFilePathA為中文的話,請使用iocnv轉碼後再使用。
            std::string newName = std::string(dirpath)+"/"+szFilePathA;
            if (newName[newName.length()-1]=='/')
            {
                FileUtils::getInstance()->createDir(newName.c_str());
                continue;
            }

            FILE* pFile2 = fopen(newName.c_str(), "w");
            if (pFile2)
            {
                fclose(pFile2);
            }
            else
            {
                CCLOG("unzip can not create file");
                return false;
            }
            unsigned long savedSize = 0;
            while(pFile2 != NULL && FileInfo.uncompressed_size > savedSize)
            {
                unsigned char *pBuffer = NULL;
                unsigned long once = FileInfo.uncompressed_size - savedSize;
                if(once > _maxUnzipBufSize)
                {
                    once = _maxUnzipBufSize;
                    pBuffer = new unsigned char[once];
                }
                else
                {
                    pBuffer = new unsigned char[once];
                }
                int nSize = unzReadCurrentFile(pFile, pBuffer, once);
                fwrite(pBuffer, once, 1, pFile2);
                
                savedSize += nSize;
                delete []pBuffer;
            }
            if (pFile2)
            {
                fclose(pFile2);
            }
            
        } while (0);
        if(nRet != UNZ_OK)
        {
            ret = false;
        }
        else
        {
            unzCloseCurrentFile(pFile);
        }
        err = unzGoToNextFile(pFile);
    }
    
    if(err != UNZ_END_OF_LIST_OF_FILE)
    {
        ret = false;
    }
    unzClose(pFile);
    return ret;
}

 這個方法 壓縮文件中不能有中文文件名的文件,因為中文在window下zip後裡面的中文是用的gb2312編碼,而IOS中用的是utf8格式,這時unzip時文件名會出錯,導致解壓失敗。

如果非得一定要使用的話,要使用iconv庫進行轉碼。具體使用方法請參考http://www.cnblogs.com/hewei2012/p/3374147.html

創建目錄的方法:在FileUtils中加個方法

#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#endif


void FileUtils::createDir(const char* p)
{
    std::string path =  p;
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
    
    mode_t processMask = umask(0);
    int ret = false;
    
    ret = mkdir(path.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
    umask(processMask);
    if (ret != 0 && (errno != EEXIST))
    {
        CCLOG("create dir fail");
    }
    
#else
    BOOL ret = false;
    
    ret = CreateDirectoryA(path.c_str(), NULL);
    if (!ret && ERROR_ALREADY_EXISTS != GetLastError())
    {
        CCLOG("create dir fail");
    }
#endif
}

 


cocos2dx中helloworld項目創建成功,怎添加cocos2d-x模塊道VS2010中

有一個插件你還沒有運行
在目錄cocos2d-2.1beta3-x-2.1.1\template\msvc下找到文件InstallWizardForVS2010.js
運行即可!
 

cocos2dx中addChild問題

精靈的動作由你控制

你把精靈addchild到layer裡面去

想要精靈做動作直接 用runAction函數
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved