Stundas uzdevums: Implementēt efektīvu lādiņu (bullet) sistēmu ar object pooling tehniku.
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ļā.
Object pooling ir tehnika, kas atkārtoti izmanto objektus, nevis tos nepārtraukti veido un dzēš. Kritisks veiktspējai šautenēs, kur var būt 100+ lādiņu vienlaikus.
class BulletPool {
private:
std::vector<Bullet*> pool;
static const int POOL_SIZE = 50;
public:
void initialize(Node* parent) {
for (int i = 0; i < POOL_SIZE; i++) {
Bullet* b = memnew(Bullet);
parent->add_child(b);
b->set_visible(false);
b->set_active(false);
pool.push_back(b);
}
}
Bullet* get_bullet() {
for (auto b : pool) {
if (!b->is_active()) {
b->set_active(true);
b->set_visible(true);
return b;
}
}
return nullptr; // pool tukšs
}
void return_bullet(Bullet* b) {
b->set_active(false);
b->set_visible(false);
}
};
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.5 Šaušanas mehānika un object pooling";
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.5 Šaušanas mehānika un object pooling; 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.5 Šaušanas mehānika un object pooling";
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 Bullet : public Area2D {
GDCLASS(Bullet, Area2D)
private:
Vector2 velocity;
float lifetime = 0;
int damage = 10;
bool active = false;
public:
void _physics_process(double delta) override {
if (!active) return;
set_position(get_position() + velocity * delta);
lifetime -= delta;
if (lifetime <= 0) deactivate();
}
void fire(Vector2 pos, Vector2 vel, float life = 2.0f) {
set_position(pos);
velocity = vel;
lifetime = life;
active = true;
set_visible(true);
}
void deactivate() {
active = false;
set_visible(false);
}
};
void Player::shoot() {
Bullet* b = pool->get_bullet();
if (b) {
Vector2 dir = (mouse_pos - get_position()).normalized();
b->fire(get_position(), dir * 800.0f);
}
}