#include #include #include #include #include #include #include #include namespace blitz { using namespace godot; static constexpr float SPEED = 20.0f; static constexpr float MaxAlive = 10.0f; void Bullet::_bind_methods() {} Bullet::Bullet() : m_Stuck(false) {} void Bullet::_ready() { Timer* timer = memnew(Timer); add_child(timer); timer->connect("timeout", callable_mp(this, &Bullet::Destroy)); timer->set_wait_time(MaxAlive); timer->start(); } Bullet::~Bullet() {} void Bullet::_process(float a_Delta) { if (Engine::get_singleton()->is_editor_hint()) { return; } auto* head = get_node("Armature"); if (m_Stuck) return; Vector3 start = get_position(); Vector3 finish = start + get_transform().basis.xform(Vector3{0, 0, -SPEED * a_Delta}); auto query = PhysicsRayQueryParameters3D::create(start, finish, 1); auto result = get_world_3d()->get_direct_space_state()->intersect_ray(query); if (result.is_empty()) { set_position(finish); return; } m_Stuck = true; Vector3 intersectPoint = result["position"]; head->set_global_position(intersectPoint); } void Bullet::Destroy() { queue_free(); } } // namespace blitz