You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:在Cocos2dx v4中使用Json.cpp加载.txt并提取文本示例

Cocos2d-x v4 加载TXT文件与多语言切换实现示例

一、加载TXT文件并提取文本

Cocos2d-x v4 提供FileUtils工具类可直接读取文件内容,最简实现代码如下:

#include "cocos2d.h"
using namespace cocos2d;

// 加载指定路径的TXT文件,返回文本内容
std::string loadTxtFile(const std::string& filePath) {
    auto fileUtils = FileUtils::getInstance();
    std::string content = fileUtils->getStringFromFile(filePath);
    
    if (content.empty()) {
        CC_LOG_ERROR("加载TXT文件失败: %s", filePath.c_str());
    }
    return content;
}

// 使用示例
void testTxtLoading() {
    // 假设文件放在Resources/lang/zh.txt
    std::string content = loadTxtFile("lang/zh.txt");
    if (!content.empty()) {
        CC_LOG_INFO("TXT内容:\n%s", content.c_str());
        // 按需处理文本,比如按行分割、提取键值对等
    }
}

二、基于内置JSON库实现多语言切换

Cocos2d-x v4 已替换为 nlohmann/json 作为默认JSON库,以下是适配多语言的完整示例:

1. 多语言JSON文件示例(lang_zh.json)

将多语言文本按键值对存入JSON文件,放置在Resources/lang目录下:

{
    "welcome": "欢迎使用本应用",
    "btn_ok": "确认",
    "btn_cancel": "取消",
    "tip_input": "请输入有效信息"
}

2. 多语言管理类实现

#include "cocos2d.h"
#include "nlohmann/json.hpp"
using namespace cocos2d;
using json = nlohmann::json;

class LangManager {
private:
    json _langData;
    static LangManager* _instance;
    
    LangManager() {}
    
public:
    static LangManager* getInstance() {
        if (!_instance) {
            _instance = new LangManager();
        }
        return _instance;
    }
    
    // 加载指定语言包文件
    bool loadLangFile(const std::string& fileName) {
        auto fileUtils = FileUtils::getInstance();
        std::string jsonStr = fileUtils->getStringFromFile(fileName);
        if (jsonStr.empty()) {
            CC_LOG_ERROR("加载语言包失败: %s", fileName.c_str());
            return false;
        }
        
        try {
            _langData = json::parse(jsonStr);
            return true;
        } catch (const json::parse_error& e) {
            CC_LOG_ERROR("JSON解析错误: %s", e.what());
            return false;
        }
    }
    
    // 根据键名获取对应语言文本
    std::string getText(const std::string& key) {
        if (_langData.contains(key)) {
            return _langData[key].get<std::string>();
        } else {
            CC_LOG_WARNING("未找到文本键: %s", key.c_str());
            return key; // 找不到时返回键名作为 fallback
        }
    }
};

// 初始化静态实例
LangManager* LangManager::_instance = nullptr;

// 使用示例
void testLangSwitch() {
    // 加载中文语言包
    if (LangManager::getInstance()->loadLangFile("lang/lang_zh.json")) {
        std::string welcome = LangManager::getInstance()->getText("welcome");
        // 直接将文本设置到UI控件
        // auto label = Label::createWithSystemFont(welcome, "Arial", 24);
    }
    
    // 切换到英文语言包
    LangManager::getInstance()->loadLangFile("lang/lang_en.json");
    std::string welcomeEn = LangManager::getInstance()->getText("welcome");
    CC_LOG_INFO("英文欢迎语: %s", welcomeEn.c_str());
}

额外适配:旧TXT键值对格式处理

如果你的旧项目使用key=value格式的TXT存储多语言,可使用以下方法解析:

#include <sstream>
#include <unordered_map>

std::unordered_map<std::string, std::string> parseKeyValueTxt(const std::string& content) {
    std::unordered_map<std::string, std::string> keyValueMap;
    std::stringstream ss(content);
    std::string line;
    
    while (std::getline(ss, line)) {
        size_t equalPos = line.find('=');
        if (equalPos != std::string::npos) {
            std::string key = line.substr(0, equalPos);
            std::string value = line.substr(equalPos + 1);
            keyValueMap[key] = value;
        }
    }
    return keyValueMap;
}

// 使用示例
void testParseOldTxt() {
    std::string content = loadTxtFile("lang/old_zh.txt");
    auto langMap = parseKeyValueTxt(content);
    std::string welcome = langMap["welcome"];
}

内容的提问来源于stack exchange,提问作者Stephen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 14:45:42