Stundas uzdevums: Apvienot tēmas prasmes - Godot Scene Tree, C++ klases - pilnvērtīgā Pong arkādes spēlē.
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ļā.
Pong ir klasiska 1972. gada arkādes spēle. Divi spēlētāji vada vertikālas paddles un atsit bumbu pretiniekam. Pirmais ar 5 punktiem uzvar.
Šis projekts ir labs 1. tēmas noslēgumam, jo tajā ir maz objektu, bet tie pārbauda gandrīz visu pamatu: Scene Tree, atkārtoti lietojamas scēnas, Input Map, C++ klases, sadursmes, UI atjaunināšanu un spēles stāvokli. Pong nav izvēlēts tāpēc, ka tas ir vizuāli sarežģīts; tas ir izvēlēts tāpēc, ka kļūdas tajā ir viegli pamanāmas.
Spēles loģika tiek rakstīta C++. Godot editorā drīkst salikt scēnas un iestatīt resursus, bet paddle kustība, bumbas atlēkšana, punktu pieskaitīšana un uzvaras pārbaude jārealizē GDExtension klasēs.
C++ klases:
Paddle - spēlētāja vadītā raķete ar ievades darbībām input_up un input_down.Ball - bumba ar ātrumu, sadursmju apstrādi un reset mehāniku.Game - punktu uzskaite, UI atjaunināšana, uzvaras noteikšana un raunda restartēšana.class Game : public Node {
GDCLASS(Game, Node)
private:
int score_left = 0;
int score_right = 0;
Ball *ball = nullptr;
public:
void _ready() override;
void on_score(bool left_player);
void reset_ball();
void update_score_labels();
};
Š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.6 Noslēguma projekts: Pong; detalizētu izpratni veidosi nākamajos uzdevumos.
Kopējamais piemērs vai sagatave: izmanto šo bloku kā starta punktu, nevis kā gala risinājumu.
class Game : public Node {
GDCLASS(Game, Node)
private:
int score_left = 0;
int score_right = 0;
Ball *ball = nullptr;
public:
void _ready() override;
void on_score(bool left_player);
void reset_ball();
void update_score_labels();
};
.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.
Pievieno vienu uzlabojumu, kas neizjauc pamata spēli.
AIPaddle : public Paddle, kas seko bumbai tikai tad, kad bumba kustas tā virzienā.bool paused, kas aptur bumbas un paddle kustību.get_node<Label>("ScoreLeft") references..sconsign.dblite un kompilē no jauna.
void Ball::reset_ball() {
set_position(Vector2(640, 360));
double y_speed = UtilityFunctions::randf_range(-180.0, 180.0);
velocity = Vector2(base_speed, y_speed);
}
void Ball::_physics_process(double delta) {
auto collision = move_and_collide(velocity * delta);
if (collision.is_valid()) {
velocity = velocity.bounce(collision->get_normal());
velocity *= 1.05f;
}
}
void Game::on_score(bool left_player) {
if (left_player) score_left++;
else score_right++;
update_score_labels();
ball->reset_ball();
}
void Game::update_score_labels() {
score_left_label->set_text(String::num_int64(score_left));
score_right_label->set_text(String::num_int64(score_right));
}