#include "player.hpp" #include "utils/godot_macros.hpp" #include #include void Player::_bind_methods() { #define CLASSNAME Player GDPROPERTY(input_directions, gd::Variant::VECTOR2); } void Player::_ready() { this->anim_tree = this->get_node("%AnimationTree"); this->sfm = gd::Object::cast_to(this->anim_tree->get("parameters/Actions/playback")); this->input = this->get_node("%PlayerInput"); this->input->listen_to(utils::PlayerInput::Listener("dir_left", "dir_right", callable_mp(this, &Player::_on_dir_horizontal))); this->input->listen_to(utils::PlayerInput::Listener("dir_backward", "dir_forward", callable_mp(this, &Player::_on_dir_vertical))); this->input->listen_to(utils::PlayerInput::Listener("look_left", "look_right", callable_mp(this, &Player::_on_look_horizontal))); this->input->listen_to(utils::PlayerInput::Listener("look_down", "look_up", callable_mp(this, &Player::_on_look_vertical))); this->input->listen_to(utils::PlayerInput::Listener("_mouse_left", "_mouse_right", callable_mp(this, &Player::_on_look_horizontal))); this->input->listen_to(utils::PlayerInput::Listener("_mouse_down", "_mouse_up", callable_mp(this, &Player::_on_look_vertical))); this->model_node = this->get_node("%CharacterModel"); } void Player::_process(double delta [[maybe_unused]]) { this->anim_tree->set("parameters/Actions/Walk/Move/blend_position", this->input_directions); } void Player::_physics_process(double delta [[maybe_unused]]) { gd::Basis const &model_basis{this->model_node->get_global_basis()}; gd::Vector3 const local_motion{this->anim_tree->get_root_motion_position()}; gd::Vector3 const motion { local_motion.x * model_basis.get_column(0) + local_motion.y * model_basis.get_column(1) + local_motion.z * model_basis.get_column(2) }; this->set_velocity(motion / delta); this->move_and_slide(); } void Player::_on_dir_horizontal(gd::Ref, float value) { this->input_directions.x = value; } void Player::_on_dir_vertical(gd::Ref, float value) { this->input_directions.y = value; } void Player::_on_look_horizontal(gd::Ref, float value) { this->input_look.x = value; } void Player::_on_look_vertical(gd::Ref, float value) { this->input_look.y = value; } void Player::set_input_directions(gd::Vector2 value [[maybe_unused]]) {} gd::Vector2 Player::get_input_directions() const { return this->input_directions; }