求助:在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
相关产品推荐
相关产品推荐

