Stundas uzdevums: Apvienot datu struktūras, AI un object pooling pilnvērtīgā top-down šautenē.
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ļā.
Top-down šautene ar šādām funkcijām:
// Klašu hierarhija
class Player : public CharacterBody2D { /* WASD + shoot */ };
class Enemy : public CharacterBody2D { /* state machine + pathfinding */ };
class FastEnemy : public Enemy { /* fast, light */ };
class Brute : public Enemy { /* slow, strong */ };
class Shooter : public Enemy { /* keeps distance, shoots */ };
class Bullet : public Area2D { /* pooled */ };
class WaveManager : public Node { /* spawns waves */ };
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++ kodā pamatoti izvēlēti vector/map/set, AI stāvokļi ir skaidri, un sarežģītākas sistēmas var profilēt vai atkļūdot.
#include <godot_cpp/variant/string.hpp>
using namespace godot;
struct AiDataCheckpoint {
String lesson = "4.6 Noslēguma projekts: Top-down šautene";
bool uses_cpp = true;
bool chooses_container = true;
bool separates_ai_state = true;
bool handles_removal_safely = 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 4.6 Noslēguma projekts: Top-down šautene; 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 AiDataCheckpoint {
String lesson = "4.6 Noslēguma projekts: Top-down šautene";
bool uses_cpp = true;
bool chooses_container = true;
bool separates_ai_state = true;
bool handles_removal_safely = 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 WaveManager : public Node {
GDCLASS(WaveManager, Node)
private:
int current_wave = 0;
float wave_timer = 0;
std::vector<Enemy*> active_enemies;
struct Wave { int fast_enemies, brutes, shooters; };
std::vector<Wave> waves = {
{3, 0, 0}, // wave 1
{5, 1, 0}, // wave 2
{6, 2, 1}, // wave 3
{8, 3, 2}, // wave 4
{10, 5, 3} // wave 5 + boss
};
public:
void _process(double delta) override {
wave_timer -= delta;
if (active_enemies.empty() && wave_timer <= 0) {
start_next_wave();
}
}
void start_next_wave() {
if (current_wave >= waves.size()) {
UtilityFunctions::print("All waves complete!");
return;
}
Wave w = waves[current_wave];
for (int i = 0; i < w.fast_enemies; i++) spawn(EnemyType::FAST);
for (int i = 0; i < w.brutes; i++) spawn(EnemyType::BRUTE);
for (int i = 0; i < w.shooters; i++) spawn(EnemyType::SHOOTER);
current_wave++;
wave_timer = 30.0f;
}
};