Stundas uzdevums: Izveidot pilnvērtīgu saglabāšanas sistēmu ar vairākiem slotiem un autosave.
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ļā.
Profesionāla save sistēma sastāv no vairākiem komponentiem:
// Saveable interface
class Saveable {
public:
virtual Dictionary save_state() const = 0;
virtual void load_state(const Dictionary& state) = 0;
};
class SaveManager : public Node {
std::vector<Saveable*> saveables;
public:
void register_saveable(Saveable* s) {
saveables.push_back(s);
}
void save_to_slot(int slot);
void load_from_slot(int slot);
};
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.3 Save/Load arhitektūra";
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.3 Save/Load arhitektūra; 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.3 Save/Load arhitektūra";
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.
class SaveManager : public Node {
GDCLASS(SaveManager, Node)
private:
std::vector<Node*> saveables;
float autosave_timer = 0;
public:
void _process(double delta) override {
autosave_timer += delta;
if (autosave_timer >= 300.0f) { // 5 min
save_to_slot(0); // 0 = autosave
autosave_timer = 0;
}
}
void save_to_slot(int slot) {
Dictionary all_data;
for (Node* n : saveables) {
if (n->has_method("save_state")) {
all_data[n->get_path()] = n->call("save_state");
}
}
all_data["timestamp"] = Time::get_singleton()->get_unix_time_from_system();
all_data["version"] = 1;
String path = "user://save_" + String::num_int64(slot) + ".json";
Ref<FileAccess> f = FileAccess::open(path, FileAccess::WRITE);
f->store_string(JSON::stringify(all_data, " "));
f->close();
}
};