feat: hit effect scenes are now preloaded

This commit is contained in:
Sara 2025-07-28 22:21:16 +02:00
parent 5a4ac26c72
commit adcbf41a48
4 changed files with 35 additions and 4 deletions

View file

@ -8,6 +8,21 @@ void Hitbox::_bind_methods() {
BIND_HPROPERTY(Variant::OBJECT, impact_effect, PROPERTY_HINT_RESOURCE_TYPE, "PackedScene"); BIND_HPROPERTY(Variant::OBJECT, impact_effect, PROPERTY_HINT_RESOURCE_TYPE, "PackedScene");
} }
void Hitbox::_notification(int what) {
if (Engine::get_singleton()->is_editor_hint()) {
return;
}
switch (what) {
default:
return;
case NOTIFICATION_READY:
if (this->impact_effect.is_valid()) {
PRELOAD_SCENE(this->impact_effect);
}
return;
}
}
void Hitbox::set_health(HealthStatus *value) { void Hitbox::set_health(HealthStatus *value) {
this->health = value; this->health = value;
} }

View file

@ -9,6 +9,9 @@ class Hitbox : public Area3D {
GDCLASS(Hitbox, Area3D); GDCLASS(Hitbox, Area3D);
static void _bind_methods(); static void _bind_methods();
protected:
void _notification(int what);
public: public:
void set_health(HealthStatus *value); void set_health(HealthStatus *value);
HealthStatus *get_health() const; HealthStatus *get_health() const;

View file

@ -14,9 +14,9 @@ void HitscanMuzzle::instantiate_impact_effect() {
if (get_collider() == nullptr) { if (get_collider() == nullptr) {
return; return;
} }
Ref<PackedScene> effect_scene{ get_collider()->call("get_impact_effect") }; Ref<PackedScene> effect_scene{ this->impact_effect };
if (!effect_scene.is_valid()) { if (get_collider()->has_method("get_impact_effect")) {
effect_scene = this->impact_effect; effect_scene = get_collider()->call("get_impact_effect");
} }
Node *effect_as_node{ effect_scene->instantiate() }; Node *effect_as_node{ effect_scene->instantiate() };
if (Node3D * effect{ cast_to<Node3D>(effect_as_node) }) { if (Node3D * effect{ cast_to<Node3D>(effect_as_node) }) {
@ -39,7 +39,9 @@ void HitscanMuzzle::try_deal_damage() {
void HitscanMuzzle::ready() { void HitscanMuzzle::ready() {
this->home_transform = get_transform(); this->home_transform = get_transform();
this->impact_effect = ResourceLoader::load("res://objects/effects/bullet_impact.tscn"); this->impact_effect = ResourceLoader::load("res://objects/effects/bullet_impact.tscn");
if (!this->impact_effect.is_valid()) { if (this->impact_effect.is_valid()) {
PRELOAD_SCENE(this->impact_effect);
} else {
print_error("HitscanMuzzle::ready: impact effect is invalid"); print_error("HitscanMuzzle::ready: impact effect is invalid");
} }
set_enabled(false); set_enabled(false);

View file

@ -1,6 +1,17 @@
#ifndef GODOT_EXTRA_MACROS_H #ifndef GODOT_EXTRA_MACROS_H
#define GODOT_EXTRA_MACROS_H #define GODOT_EXTRA_MACROS_H
#define PRELOAD_SCENE(m_scene) \
do { \
if (Node * node{ m_scene->instantiate() }) { \
if (Node3D * node_3d{ cast_to<Node3D>(node) }) { \
node_3d->set_visible(false); \
} \
get_tree()->get_current_scene()->add_child(node); \
node->connect("ready", callable_mp(node, &Node::queue_free)); \
} \
} while (0)
#define BIND_GET_SET(m_property) \ #define BIND_GET_SET(m_property) \
ClassDB::bind_method(D_METHOD("set_" #m_property, #m_property), \ ClassDB::bind_method(D_METHOD("set_" #m_property, #m_property), \
&self_type::set_##m_property); \ &self_type::set_##m_property); \