Stundas uzdevums: Uzrakstīt pirmo strādājošu C++ klasi un attiecināt to uz Godot Node.
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 C++ klase tiek definēta divos failos: .hpp (header) un .cpp (implementation). Header fails pasaka, kas klase ir un kādas metodes tai ir; implementation fails pasaka, ko šīs metodes dara. Šāds dalījums ir būtisks C++ valodā, jo kompilators katru failu apstrādā atsevišķi.
Lai Godot redzētu C++ klasi kā node tipu, klasei jāmanto no Godot klases, piemēram, Node vai Node2D, jāizmanto GDCLASS makro un jābūt reģistrētai ar ClassDB::register_class. Bez reģistrācijas C++ kods var kompilēties, bet Godot editorā klase neparādīsies.
// hello.hpp
#pragma once
#include <godot_cpp/classes/node.hpp>
#include <godot_cpp/variant/string.hpp>
namespace godot {
class Hello : public Node {
GDCLASS(Hello, Node)
private:
int counter = 0;
String player_name = "Pong Player";
protected:
static void _bind_methods();
public:
Hello();
~Hello();
void _ready() override;
void say_hello();
};
} // namespace godot
Pamata C++ datu tipi:
| Tips | Apraksts |
|---|---|
int | Vesels skaitlis |
float | Decimālskaitlis 32-bit |
bool | true/false |
String | Godot virkne |
Vector2 | 2D vektors (x, y) |
Dzīves cikls: konstruktors sagatavo C++ objektu, _ready() tiek izsaukts, kad node jau ir scēnā, bet _bind_methods() savieno C++ metodes ar Godot atspoguļošanas sistēmu. Spēles sākumā visdrošāk testēt izvadi ar UtilityFunctions::print.
Š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 1.4 Pirmais C++ skripts: mainīgie un izvade; detalizētu izpratni veidosi nākamajos uzdevumos.
Kopējamais piemērs vai sagatave: izmanto šo bloku kā starta punktu, nevis kā gala risinājumu.
// hello.hpp
#pragma once
#include <godot_cpp/classes/node.hpp>
#include <godot_cpp/variant/string.hpp>
namespace godot {
class Hello : public Node {
GDCLASS(Hello, Node)
private:
int counter = 0;
String player_name = "Pong Player";
protected:
static void _bind_methods();
public:
Hello();
~Hello();
void _ready() override;
void say_hello();
};
} // namespace godot
.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.
Eksperimentē ar datu tipiem, nezaudējot C++ struktūru.
float score = 0.0f un izdrukā to _ready() metodē.Vector2 spawn_position un izdrukā tā x un y vērtības.
// hello.cpp
#include "hello.hpp"
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/variant/utility_functions.hpp>
using namespace godot;
void Hello::_bind_methods() {
ClassDB::bind_method(D_METHOD("say_hello"), &Hello::say_hello);
}
Hello::Hello() {
counter = 0;
player_name = "Pong Player";
}
Hello::~Hello() {}
void Hello::_ready() {
UtilityFunctions::print("Hello, Godot! No C++.");
say_hello();
}
void Hello::say_hello() {
counter++;
UtilityFunctions::print("Sveiciens Nr. ", counter, " spēlētājam ", player_name);
}