Stundas uzdevums: Saglabāt sarežģītus datu struktūras, izmantojot JSON un Godot Resource klases.
Pirms sāc: izmanto iepriekš apgūto un šīs lapas teorijas/koda piemērus. Ja vajadzīga jauna komanda vai rīks, vispirms atrodi tās paraugu teorijas sadaļā.
JSON (JavaScript Object Notation) ir cilvēkam un mašīnai lasāms datu formāts. Godot piedāvā JSON klasi tā parsēšanai.
#include <godot_cpp/classes/json.hpp>
// Dictionary -> JSON string
Dictionary save_data;
save_data["player_name"] = "Anna";
save_data["level"] = 5;
save_data["inventory"] = Array(); // var saturēt vēl Dictionary
String json_str = JSON::stringify(save_data, " "); // 2-space indent
// JSON string -> Dictionary
Ref<JSON> json = memnew(JSON);
Error err = json->parse(json_str);
if (err == OK) {
Variant data = json->get_data();
Dictionary loaded = data;
String name = loaded["player_name"];
}
Resource ir Godot iebūvēta klase resursu (audio, attēli, custom data) saglabāšanai .tres failos.
Atceries: ar redzamu efektu editorā nepietiek. Paskaidro, kura C++ klase glabā stāvokli, kura metode to maina un kā Godot node struktūra izmanto šo kodu.
Pārbaudi: C++ kods pārbauda failu kļūdas, validē datus, izmanto versijas lauku un pamato algoritmu sarežģītību.
#include <godot_cpp/variant/string.hpp>
using namespace godot;
struct PersistenceCheckpoint {
String lesson = "5.2 JSON serializācija un Resource sistēma";
bool uses_cpp = true;
bool handles_missing_file = true;
bool validates_data = true;
bool documents_complexity = true;
};
Šis ir īss iesildīšanās uzdevums. Nokopē sagatavi, ielīmē to pareizajā koda vietā un palaid. Šeit pietiek droši izmēģināt tēmu 5.2 JSON serializācija un Resource sistēma; detalizētu izpratni veidosi nākamajos uzdevumos.
Kopējamais piemērs vai sagatave: izmanto šo bloku kā starta punktu, nevis kā gala risinājumu.
#include <godot_cpp/variant/string.hpp>
using namespace godot;
struct PersistenceCheckpoint {
String lesson = "5.2 JSON serializācija un Resource sistēma";
bool uses_cpp = true;
bool handles_missing_file = true;
bool validates_data = true;
bool documents_complexity = true;
};
.cpp vai .hpp failā pie šīs stundas klases.Pievieno šīs stundas paņēmienu kā nelielu, strādājošu spēles mehānikas daļu.
PlayerState, velocity, score vai update_ui()._ready(), _process(), _physics_process(), signāla apstrādātāja vai projekta palīgklases.Pārbaudi, vai C++ algoritms darbojas paredzami spēles vidē.
Ja pamatdarbs ir pabeigts, paplašini spēli ar vienu nelielu C++ uzlabojumu.
Dictionary Player::to_dict() const {
Dictionary d;
d["name"] = name;
d["hp"] = hp;
d["max_hp"] = max_hp;
d["level"] = level;
d["xp"] = xp;
d["position_x"] = get_position().x;
d["position_y"] = get_position().y;
Array inv;
for (const auto& [item, count] : inventory) {
Dictionary entry;
entry["item"] = item;
entry["count"] = count;
inv.append(entry);
}
d["inventory"] = inv;
return d;
}
void Player::from_dict(const Dictionary& d) {
name = d["name"];
hp = d["hp"];
max_hp = d["max_hp"];
level = d["level"];
xp = d["xp"];
set_position(Vector2(d["position_x"], d["position_y"]));
inventory.clear();
Array inv = d["inventory"];
for (int i = 0; i < inv.size(); i++) {
Dictionary e = inv[i];
inventory[e["item"]] = e["count"];
}
}