Stundas uzdevums: Apgūt Godot signal sistēmu objektu komunikācijai.
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ļā.
Godot signāli ir veids, kā objekti var sazināties bez tieša savienojuma. Viens objekts emit (raida) signālu, citi connect (pievienojas), lai uz to reaģētu.
// Klases definīcijā ar signal
class Participant : public Node {
GDCLASS(Participant, Node)
protected:
static void _bind_methods() {
ClassDB::bind_method(...);
// Reģistrē signal
ADD_SIGNAL(MethodInfo("finished", PropertyInfo(Variant::STRING, "name")));
ADD_SIGNAL(MethodInfo("penalty_applied", PropertyInfo(Variant::INT, "amount")));
}
public:
void apply_penalty(int amount) {
energy -= amount;
emit_signal("penalty_applied", amount);
if (energy <= 0) emit_signal("finished", name);
}
};
Citur kodā:
hero->connect("finished", Callable(this, "on_hero_finished"));
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.3 Signāli un objektu komunikācija";
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.3 Signāli un objektu komunikācija; 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.3 Signāli un objektu komunikācija";
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.
is_connected.
#include <godot_cpp/core/method_bind.hpp>
void Participant::_bind_methods() {
ClassDB::bind_method(D_METHOD("apply_penalty", "amount"),
&Participant::apply_penalty);
ADD_SIGNAL(MethodInfo("penalty_applied",
PropertyInfo(Variant::INT, "amount")));
ADD_SIGNAL(MethodInfo("finished",
PropertyInfo(Variant::STRING, "name")));
}
void Participant::apply_penalty(int amount) {
energy = std::max(0, energy - amount);
emit_signal("penalty_applied", amount);
if (energy == 0) {
emit_signal("finished", name);
}
}
// Game klasē
void Game::_ready() {
Participant* anna = ...;
anna->connect("penalty_applied", Callable(this, "on_penalty"));
anna->connect("finished", Callable(this, "on_finished"));
}