Stundas uzdevums: Ģenerēt nejaušus, bet sakārtotus līmeņus ar algoritmu.
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ļā.
Procedural generation ir tehnika, kas algoritmiski rada saturu (līmeņus, labirintus, pasaules) bez manuālas dizainas. Klasiskais pieteikums - procedurāls klases labirints.
Pamata pieejas:
// Random walk labirints
class MazeGenerator {
private:
static const int WIDTH = 50;
static const int HEIGHT = 30;
int grid[WIDTH][HEIGHT];
public:
void generate(int seed) {
std::srand(seed);
// Sāc visu kā sienas
for (int x = 0; x < WIDTH; x++)
for (int y = 0; y < HEIGHT; y++)
grid[x][y] = WALL;
// Random walk
int x = WIDTH / 2, y = HEIGHT / 2;
for (int step = 0; step < 1000; step++) {
grid[x][y] = FLOOR;
int dir = std::rand() % 4;
if (dir == 0 && x > 1) x--;
else if (dir == 1 && x < WIDTH-2) x++;
else if (dir == 2 && y > 1) y--;
else if (dir == 3 && y < HEIGHT-2) y++;
}
}
};
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.4 Procedural generation";
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.4 Procedural generation; 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.4 Procedural generation";
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 MazeGenerator {
private:
static const int WIDTH = 50;
static const int HEIGHT = 30;
int grid[50][30];
public:
void generate(int seed) {
std::srand(seed);
// Visi sienas
for (int x = 0; x < WIDTH; x++)
for (int y = 0; y < HEIGHT; y++)
grid[x][y] = 1; // siena
// Random walk
int x = WIDTH / 2, y = HEIGHT / 2;
for (int step = 0; step < 800; step++) {
grid[x][y] = 0; // grīda
int dir = std::rand() % 4;
if (dir == 0 && x > 1) x--;
else if (dir == 1 && x < WIDTH-2) x++;
else if (dir == 2 && y > 1) y--;
else if (dir == 3 && y < HEIGHT-2) y++;
}
}
void render_to_tilemap(TileMap* tm) {
for (int x = 0; x < WIDTH; x++) {
for (int y = 0; y < HEIGHT; y++) {
int tile_id = grid[x][y];
tm->set_cell(0, Vector2i(x, y), tile_id, Vector2i(0, 0));
}
}
}
};