Stundas uzdevums: Izmantot struct datu grupēšanai un kompozīciju (composition) klašu organizēšanai.
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ļā.
struct ir vienkāršāka klase - visi lauki ir public pēc noklusējuma. Lietojama datu grupēšanai.
struct Stats {
int energy = 100;
int max_energy = 100;
int focus = 10;
int calm = 5;
int speed = 5;
void heal(int amount) {
energy = std::min(max_energy, energy + amount);
}
};
class Participant {
private:
Stats stats; // kompozīcija!
String name;
public:
Participant(String n) : name(n) {}
Stats& get_stats() { return stats; } // atgriež references
};
Kompozīcija (klase satur citu klasi) bieži ir labāka par mantošanu - fleksiblāka un mazāk saistīta.
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: katrai būtiskai turnīra lomai ir C++ klase ar header/implementation dalījumu, konstruktoriem, metodēm, signāliem vai mantošanu.
#include <godot_cpp/variant/string.hpp>
using namespace godot;
struct OopCheckpoint {
String lesson = "3.5 Statistikas sistēma un struct";
bool uses_cpp = true;
bool has_header_file = true;
bool has_single_responsibility = true;
bool uses_godot_registration = 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 3.5 Statistikas sistēma un struct; 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 OopCheckpoint {
String lesson = "3.5 Statistikas sistēma un struct";
bool uses_cpp = true;
bool has_header_file = true;
bool has_single_responsibility = true;
bool uses_godot_registration = 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.
struct Stats {
int energy = 100, max_energy = 100;
int focus = 10, calm = 5, speed = 5;
std::vector<Buff> buffs;
int get_total_focus() const {
int total = focus;
for (const auto& b : buffs) {
if (b.target == "focus") total += b.amount;
}
return total;
}
void apply_penalty(int amount) {
int actual = std::max(1, amount - calm);
energy = std::max(0, energy - actual);
}
void update(float delta) {
for (auto& b : buffs) b.duration -= delta;
buffs.erase(std::remove_if(buffs.begin(), buffs.end(),
[](const Buff& b) { return b.duration <= 0; }),
buffs.end());
}
};