trenches/src/player.cpp

55 lines
2.2 KiB
C++
Raw Normal View History

2024-11-26 23:41:39 +00:00
#include "player.hpp"
#include "utils/godot_macros.hpp"
#include <godot_cpp/variant/utility_functions.hpp>
#include <godot_cpp/classes/input_event_joypad_motion.hpp>
2024-11-26 23:41:39 +00:00
void Player::_bind_methods() {
#define CLASSNAME Player
2024-11-30 22:48:30 +00:00
GDFUNCTION(get_input_directions);
}
2024-11-26 23:41:39 +00:00
void Player::_ready() {
2024-11-30 22:48:30 +00:00
if(gd::Engine::get_singleton()->is_editor_hint())
return;
2024-11-26 23:41:39 +00:00
this->anim_tree = this->get_node<gd::AnimationTree>("%AnimationTree");
this->sfm = gd::Object::cast_to<gd::AnimationNodeStateMachinePlayback>(this->anim_tree->get("parameters/Actions/playback"));
this->input = this->get_node<utils::PlayerInput>("%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)));
2024-11-26 23:41:39 +00:00
this->model_node = this->get_node<gd::Node3D>("%CharacterModel");
}
2024-11-30 22:48:30 +00:00
void Player::_process(double delta) {
if(gd::Engine::get_singleton()->is_editor_hint())
return;
this->anim_tree->set("parameters/Actions/Walk/Forward/blend_amount", gd::Math::clamp(this->input_directions.y, 0.5f, 1.f));
this->rotate_y(-this->input_directions.x * delta);
}
void Player::_physics_process(double delta [[maybe_unused]]) {
2024-11-30 22:48:30 +00:00
if(gd::Engine::get_singleton()->is_editor_hint())
return;
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) +
2024-11-30 22:48:30 +00:00
local_motion.z * model_basis.get_column(2) +
(this->is_on_floor() ? gd::Vector3{} : gd::Vector3{0.f, -1.f, 0.f})
};
this->set_velocity(motion / delta);
this->move_and_slide();
}
void Player::_on_dir_horizontal(gd::Ref<gd::InputEvent>, float value) {
this->input_directions.x = value;
}
void Player::_on_dir_vertical(gd::Ref<gd::InputEvent>, float value) {
this->input_directions.y = value;
}
gd::Vector2 Player::get_input_directions() const {
return this->input_directions;
2024-11-26 23:41:39 +00:00
}