[M1 Mac, Monterey 12.6.3, clang 13.0.0, SDL 2.26.2, ChatGPT Plus, NO IDE]
製作中のテトリスはアプリ起動中の最高スコアを表示していて、閉じるとデータは消えてしまいます。
そこでxmlファイルに最高スコアを保存し、起動の度にxmlファイルを読み込み、ゲームオーバー時に更新するようにしました。同時にバックアップファイルも作成しています。
xmlファイル作成・読込はJavaアプリで扱ったことはありますが、今回はChatGPTを使ってサクッと作りました。Homebrewでインストールしたpugixmlライブラリを使っています。
ある程度プログラミングが分かる方はChatGPT Plusを活用されることをお勧めします。学習・作業効率がこれまでと段違いです。
#include "pugixml.hpp"
extern string xmlFile;
extern string xmlFileBackup;
int readXML(){
pugi::xml_document doc;
cout << "readXML関数 xmlFile: " << xmlFile << endl;
// XMLファイルを読み込む
pugi::xml_parse_result result = doc.load_file(xmlFile.c_str());
if (!result) {
std::cerr << "XMLの読み込みに失敗しました。" << std::endl;
return -1;
}
// ルートノードを取得する
pugi::xml_node root = doc.child("properties");
// HISCOREのエントリーを取得する
pugi::xml_node hiscore_node = root.find_child_by_attribute("entry", "key", "HISCORE");
// エントリーの値を取得する
hiScore = hiscore_node.text().as_int();
std::cout << "HISCOREの値は" << hiScore << "です。" << std::endl;
return hiScore;
}
int writeXML(){
pugi::xml_document doc;
cout << "writeXML関数 xmlFile: " << xmlFile << endl;
// XMLファイルを読み込む
pugi::xml_parse_result result = doc.load_file(xmlFile.c_str());
if (!result) {
std::cerr << "XMLの読み込みに失敗しました。" << std::endl;
return -1;
}
// ルートノードを取得する
pugi::xml_node root = doc.child("properties");
// HISCOREのエントリーを取得する
pugi::xml_node hiscore_node = root.find_child_by_attribute("entry", "key", "HISCORE");
// エントリーの値を書き換える
hiscore_node.text().set(hiScore);
// XMLファイルを上書きする
doc.save_file(xmlFile.c_str());
std::cout << "更新するHISCOREの値は" << hiScore << "です。" << std::endl;
// ファイルを読み込む
std::ifstream file(xmlFile);
if (!file.good()) {
std::cerr << "ファイルの読み込みに失敗しました。" << std::endl;
return -1;
}
// バックアップファイルを作成する
std::ofstream backup(xmlFileBackup);
if (!backup.good()) {
std::cerr << "バックアップファイルの作成に失敗しました。" << std::endl;
return -1;
}
// バックアップファイルにデータを書き込む
backup << file.rdbuf();
// ファイルを閉じる
file.close();
backup.close();
std::cout << "バックアップファイルを作成しました。" << std::endl;
}