#include "player_body.h" #include "macros.h" #include "player_input.h" #include "weapon_base.h" #include "weapon_inventory.h" PlayerBody *PlayerBody::singleton_instance{ nullptr }; void PlayerBody::_bind_methods() { } void PlayerBody::ready() { PlayerInput *input{ cast_to(get_node(NodePath("%PlayerInput"))) }; input->connect(PlayerInput::sig_movement_input, callable_mp(this, &self_type::set_movement_input)); input->connect(PlayerInput::sig_look_input, callable_mp(this, &self_type::on_look_input)); input->connect(PlayerInput::sig_jump, callable_mp(this, &self_type::on_jump_input)); input->connect(PlayerInput::sig_run, callable_mp(this, &self_type::on_run_input)); this->weapons = cast_to(get_node(NodePath("%WeaponInventory"))); } void PlayerBody::process(double delta) { } void PlayerBody::physics_process(double delta) { GETSET(velocity, { Vector2 input{ this->movement_input.normalized() }; if (get_is_running()) { input.y *= this->run_speed; input.x *= this->walk_speed; } else { input *= this->walk_speed; } velocity = velocity.move_toward(Vector3{ input.y * get_global_basis().get_column(2) + input.x * get_global_basis().get_column(0) } + Vector3{ 0.f, velocity.y, 0.f }, delta * this->acceleration); velocity += get_gravity() * delta; }); move_and_slide(); } void PlayerBody::set_movement_input(Vector2 state) { this->movement_input = state; } void PlayerBody::on_look_input(Vector2 look) { rotate_y(look.x); } void PlayerBody::on_jump_input() { if (this->is_on_floor()) { GETSET(velocity, { velocity.y = this->jump_strength; }); } } void PlayerBody::on_run_input(bool run) { this->try_running = run; } void PlayerBody::_notification(int what) { if (Engine::get_singleton()->is_editor_hint()) { return; // don't run in editor } switch (what) { default: return; case NOTIFICATION_ENTER_TREE: singleton_instance = this; return; case NOTIFICATION_EXIT_TREE: singleton_instance = nullptr; return; case NOTIFICATION_READY: set_process(true); set_physics_process(true); ready(); return; case NOTIFICATION_PROCESS: process(get_process_delta_time()); return; case NOTIFICATION_PHYSICS_PROCESS: physics_process(get_physics_process_delta_time()); return; } } PlayerBody *PlayerBody::get_singleton() { return singleton_instance; } bool PlayerBody::get_is_running() const { return this->try_running && this->movement_input.y > 0.f && this->weapons->get_current_weapon()->allows_running(); }