generated from Persson-dev/Godot-Xmake
remrem
This commit is contained in:
@@ -20,63 +20,92 @@ using namespace godot;
|
||||
|
||||
void Player::_bind_methods() {}
|
||||
|
||||
Player::Player() : m_PeerId(0) {
|
||||
// we set the player to an invalid position
|
||||
set_position({-99999, -999999, -999999});
|
||||
}
|
||||
Player::Player() : m_PeerId(0) {}
|
||||
|
||||
Player::~Player() {}
|
||||
|
||||
void Player::_ready() {
|
||||
godot::InputMap::get_singleton()->load_from_project_settings();
|
||||
m_Mesh = Object::cast_to<godot::Node3D>(find_child("Mesh"));
|
||||
m_AnimationTree = Object::cast_to<godot::AnimationTree>(find_child("AnimationTree"));
|
||||
DEV_ASSERT(m_Mesh);
|
||||
DEV_ASSERT(m_AnimationTree);
|
||||
if (Engine::get_singleton()->is_editor_hint()) {
|
||||
return;
|
||||
}
|
||||
|
||||
animate(0);
|
||||
m_Player = get_node<CharacterBody3D>("Player");
|
||||
DEV_ASSERT(m_Player);
|
||||
|
||||
// we set the player to an invalid position
|
||||
m_Player->set_position({-99999, -999999, -999999});
|
||||
|
||||
m_Head = get_node<Node3D>("Player/Head");
|
||||
DEV_ASSERT(m_Head);
|
||||
|
||||
m_Mesh = get_node<Node3D>("Player/Armature");
|
||||
DEV_ASSERT(m_Mesh);
|
||||
|
||||
m_AnimationTree = get_node<AnimationTree>("Player/AnimationTree");
|
||||
DEV_ASSERT(m_AnimationTree);
|
||||
}
|
||||
|
||||
void Player::_physics_process(float delta) {
|
||||
if (godot::Engine::get_singleton()->is_editor_hint())
|
||||
return;
|
||||
|
||||
move_and_slide();
|
||||
animate(delta);
|
||||
m_Player->move_and_slide();
|
||||
UpdateAnimation(delta);
|
||||
}
|
||||
|
||||
void Player::animate(float delta) {
|
||||
if (is_on_floor()) {
|
||||
m_AnimationTree->set("parameters/ground_air_transition/transition_request", "grounded");
|
||||
Vector3 Player::GetPosition() const {
|
||||
return m_Player->get_position();
|
||||
}
|
||||
|
||||
float speed = get_velocity().length();
|
||||
void Player::SetPosition(const Vector3& a_Position) {
|
||||
m_Player->set_position(a_Position);
|
||||
}
|
||||
|
||||
if (speed > 0.2f) {
|
||||
if (speed >= RunSpeed) {
|
||||
m_AnimationTree->set("parameters/iwr_blend/blend_amount",
|
||||
godot::UtilityFunctions::lerp(
|
||||
m_AnimationTree->get("parameters/iwr_blend/blend_amount"), 1.0, delta * AnimationBlend));
|
||||
} else {
|
||||
m_AnimationTree->set("parameters/iwr_blend/blend_amount",
|
||||
godot::UtilityFunctions::lerp(
|
||||
m_AnimationTree->get("parameters/iwr_blend/blend_amount"), 0.0, delta * AnimationBlend));
|
||||
}
|
||||
} else {
|
||||
m_AnimationTree->set("parameters/iwr_blend/blend_amount",
|
||||
godot::UtilityFunctions::lerp(
|
||||
m_AnimationTree->get("parameters/iwr_blend/blend_amount"), -1.0, delta * AnimationBlend));
|
||||
}
|
||||
Vector3 Player::GetVelocity() const {
|
||||
return m_Player->get_velocity();
|
||||
}
|
||||
|
||||
void Player::SetVelocity(const Vector3& a_Velocity) {
|
||||
m_Player->set_velocity(a_Velocity);
|
||||
}
|
||||
|
||||
void Player::UpdateAnimation(float a_Delta) {
|
||||
Vector3 velocity = m_Player->get_velocity();
|
||||
float angle = m_Player->get_rotation().y;
|
||||
|
||||
Vector3 direction = velocity.rotated({0, 1, 0}, -angle);
|
||||
if (direction.length() < 1.0f) {
|
||||
direction.zero();
|
||||
} else {
|
||||
m_AnimationTree->set("parameters/ground_air_transition/transition_request", "air");
|
||||
direction.normalize();
|
||||
}
|
||||
|
||||
Vector2 inputDirection = Input::get_singleton()->get_vector("move_left", "move_right", "move_forwards", "move_backwards");
|
||||
|
||||
BlendAnimation("parameters/Movement/Side/blend_amount", direction.x, a_Delta);
|
||||
BlendAnimation("parameters/Movement/Straight/blend_amount", direction.z, a_Delta);
|
||||
|
||||
|
||||
float ratio = 0.5f - (UtilityFunctions::absf(direction.z) - UtilityFunctions::absf(direction.x)) * 0.5f;
|
||||
BlendAnimation("parameters/Movement/Walking/blend_amount", ratio, a_Delta);
|
||||
|
||||
m_AnimationTree->set("parameters/conditions/jump", !m_Player->is_on_floor() && m_Player->get_velocity().y > 0.0f);
|
||||
m_AnimationTree->set("parameters/conditions/is_on_floor", m_Player->is_on_floor());
|
||||
}
|
||||
|
||||
void Player::BlendAnimation(const godot::String& a_AnimationName, float a_Goal, float a_Delta) {
|
||||
m_AnimationTree->set(
|
||||
a_AnimationName, UtilityFunctions::lerp(m_AnimationTree->get(a_AnimationName), a_Goal, a_Delta * AnimationBlend));
|
||||
}
|
||||
|
||||
void Player::SetModelVisible(bool visible) {}
|
||||
|
||||
Vector3 Player::GetCameraRotation() const {
|
||||
return m_Mesh->get_rotation();
|
||||
return m_Player->get_rotation();
|
||||
}
|
||||
|
||||
void Player::SetCameraRotation(const Vector3& a_Rotation) {
|
||||
m_Mesh->set_rotation(a_Rotation);
|
||||
m_Player->set_rotation(a_Rotation);
|
||||
}
|
||||
|
||||
} // namespace blitz
|
||||
|
||||
Reference in New Issue
Block a user