Stundas uzdevums: Apgūt CharacterBody2D, Area2D un RigidBody2D atšķirības un to lietojumu.
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 piedāvā trīs galvenos sadursmju nodes:
| Node | Lietojums |
|---|---|
StaticBody2D | Nekustīgi šķēršļi (siena, grīda). |
CharacterBody2D | Spēlētāji un AI ar pielāgotu kustību (ne fiziku). |
RigidBody2D | Pilna fizika - gravitācija, masa, spēks. |
Area2D | Detektē ieiešanu/iziešanu zonā (trigger, pickup). |
Collision Layers un Masks: nosaka, kas var sadurties ar ko.
// Area2D signāls C++
void Pickup::_ready() {
connect("body_entered", Callable(this, "on_body_entered"));
}
void Pickup::on_body_entered(Node2D *body) {
if (body->is_in_group("player")) {
// savākt pickup
get_parent()->call("score_up", 1);
queue_free(); // dzēst sevi
}
}
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: spēlētājs, objekti un sadursmes darbojas ar C++ klasēm, kas lieto _physics_process, Input, CharacterBody2D, Area2D vai move_and_slide.
#include <godot_cpp/variant/string.hpp>
using namespace godot;
struct PhysicsCheckpoint {
String lesson = "2.4 Sadursmju noteikšana";
bool uses_cpp = true;
bool uses_physics_process = true;
bool uses_delta_time = true;
bool checks_collisions = 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 2.4 Sadursmju noteikšana; 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 PhysicsCheckpoint {
String lesson = "2.4 Sadursmju noteikšana";
bool uses_cpp = true;
bool uses_physics_process = true;
bool uses_delta_time = true;
bool checks_collisions = 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.
#include "coin.hpp"
#include <godot_cpp/core/class_db.hpp>
#include <godot_cpp/variant/callable.hpp>
using namespace godot;
void Coin::_bind_methods() {
ClassDB::bind_method(D_METHOD("on_body_entered", "body"),
&Coin::on_body_entered);
}
void Coin::_ready() {
connect("body_entered", Callable(this, "on_body_entered"));
}
void Coin::on_body_entered(Node2D *body) {
if (body->is_in_group("player")) {
// Pavadi ziņu vecākam ar score
get_tree()->call_group("game", "add_score", 1);
queue_free();
}
}