cocos2dx 3.0 找不到资源导致黑屏(用cocos new 创建的default工程一定要记得修改工作目录的配置)

在使用cocos2dx 3.0创建新工程时,若工程启动黑屏,可能是由于找不到Resource目录下的资源。问题源于cocos2dx在Windows下通过GetCurrentDirectoryW获取工作目录作为资源路径,而默认配置中工作目录为$(ProjectDir),即proj.win32目录。解决方法是修改工作目录配置,确保指向正确资源位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    昨天在调新工程的时候发现个问题,程序启动后直接黑屏了,设断点看了一下,发现时因为无法找到Resource目录下的资源,仔细检查了一下,文件名都没错,到底为什么会有这种情况,然后又开了cocos2dx的官方例子看了看,发现官方例子都是没问题的,我这工程是直接用cocos new命令生成的,难道被官方坑了?还是打开方式不对?决定跟进程序看一下。发现这个跟cocos2dx在win32下读取文件的流程有关,cocos2dx在win32下读取文件的核心几步大概是这样,首先是通过FileUtils::fullPathForFilename这个方法找到绝对路径,注意该方法中的这段代码:

    for (auto searchIt = _searchPathArray.cbegin(); searchIt != _searchPathArray.cend(); ++searchIt)
    {
        for (auto resolutionIt = _searchResolutionsOrderArray.cbegin(); resolutionIt != _searchResolutionsOrderArray.cend(); ++resolutionIt)
        {
            fullpath = this->getPathForFilename(newFilename, *resolutionIt, *searchIt);
            
            if (fullpath.length() > 0)
            {
                // Using the filename passed in as key.
                _fullPathCache.insert(std::make_pair(filename, fullpath));
                return fullpath;
            }
        }
    }

    其实寻找的路径在_searchPathArray这个数组中,这个里面是绝对路径,这个数组可以通过FileUtils::setSearchPaths这个接口来设置,这个看下API就懂了。回到正题上,这个路径为什么会不对,在跟进去看,这个路径数组是怎么组成的,这个路径数组默认只是由一个路径组成,在FileUtils::init这个方法中可以看到他怎么构成的:

bool FileUtils::init()
{
    _searchPathArray.push_back(_defaultResRootPath);
    _searchResolutionsOrderArray.push_back("");
    return true;
}

可以发现默认是在_defaultResRootPath这个路径搜索,这个字符串默认又是怎么生成的呢,在FileUtilsWin32::init这个方法中我们可以找到:

bool FileUtilsWin32::init()
{
    _checkPath();
    _defaultResRootPath = s_resourcePath;
    return FileUtils::init();
}

再往下跟,看看s_resourcePath是怎么来的,在CCFileUtilsWin32.cpp这个文件中有这样一个静态函数:

static void _checkPath()
{
    if (0 == s_resourcePath.length())
    {
        WCHAR utf16Path[CC_MAX_PATH] = {0};
        GetCurrentDirectoryW(sizeof(utf16Path)-1, utf16Path);
        
        char utf8Path[CC_MAX_PATH] = {0};
        int nNum = WideCharToMultiByte(CP_UTF8, 0, utf16Path, -1, utf8Path, sizeof(utf8Path), NULL, NULL);


        s_resourcePath = convertPathFormatToUnixStyle(utf8Path);
        s_resourcePath.append("/");
    }
}

我们发现在win32下,cocos2dx是通过GetCurrentDirectoryW获取到工作目录来在该目录下进行资源搜索的,在看下项目配置,



好吧,默认的工作目录是$(ProjectDir)这个宏的路径,看下这个宏,发现他指向的是proj.win32这个目录,怪不得会错,再看下cocos2dx官方例子的配置,



。。。。。。

好吧,所以一定要注意,用cocos new生成项目之后一定要改掉这个配置,或者把cocos new使用的default模板的这个参数直接改掉,不然会出现资源无法加载的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值