Stundas uzdevums: Konfigurēt Input Map un izveidot WASD/bultiņu vadāmu spēlētāju.
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ā divus veidus apstrādāt input:
Input::is_action_pressed("move_right") katrā kadrā pārbauda stāvokli._input(Ref<InputEvent> event) reaģē uz konkrētu notikumu.Spēļu kustībai parasti lieto polling (jo notiek katrā kadrā).
#include <godot_cpp/classes/input.hpp>
void Player::_physics_process(double delta) {
Input *input = Input::get_singleton();
Vector2 movement = Vector2(0, 0);
if (input->is_action_pressed("move_right")) movement.x += 1;
if (input->is_action_pressed("move_left")) movement.x -= 1;
if (input->is_action_pressed("move_up")) movement.y -= 1;
if (input->is_action_pressed("move_down")) movement.y += 1;
movement = movement.normalized(); // diagonāles ātrums = taisns ātrums
velocity = movement * speed;
move_and_slide();
}
Input Map definē abstraktas darbības (move_right) un saista tās ar konkrētiem taustiņiem. Project Settings → Input Map.
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.2 Input apstrāde un Input Map";
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.2 Input apstrāde un Input Map; 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.2 Input apstrāde un Input Map";
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.
.normalized().move_and_slide(), ne set_position.
#include <godot_cpp/classes/input.hpp>
void Player::_physics_process(double delta) {
Input *input = Input::get_singleton();
Vector2 dir(0, 0);
if (input->is_action_pressed("move_right")) dir.x += 1;
if (input->is_action_pressed("move_left")) dir.x -= 1;
if (input->is_action_pressed("move_up")) dir.y -= 1;
if (input->is_action_pressed("move_down")) dir.y += 1;
velocity = dir.normalized() * speed;
move_and_slide();
}