feat: added health node and health entity interface
This commit is contained in:
parent
00a9334653
commit
50392dd3ed
47
src/health.cpp
Normal file
47
src/health.cpp
Normal file
|
@ -0,0 +1,47 @@
|
|||
#include "health.hpp"
|
||||
#include "utils/godot_macros.h"
|
||||
#include <algorithm>
|
||||
#include <godot_cpp/core/object.hpp>
|
||||
#include <godot_cpp/core/property_info.hpp>
|
||||
|
||||
namespace godot {
|
||||
void Health::_bind_methods() {
|
||||
#define CLASSNAME Health
|
||||
GDPROPERTY(max_health, Variant::INT);
|
||||
ClassDB::add_signal("Health", MethodInfo("damage", PropertyInfo(Variant::INT, "delta"), PropertyInfo(Variant::INT, "remaining")));
|
||||
ClassDB::add_signal("Health", MethodInfo("heal", PropertyInfo(Variant::INT, "delta"), PropertyInfo(Variant::INT, "remaining")));
|
||||
ClassDB::add_signal("Health", MethodInfo("health_changed", PropertyInfo(Variant::INT, "delta"), PropertyInfo(Variant::INT, "remaining")));
|
||||
ClassDB::add_signal("Health", MethodInfo("death", PropertyInfo(Variant::INT, "delta")));
|
||||
}
|
||||
|
||||
void Health::_enter_tree() {
|
||||
this->health = this->max_health;
|
||||
}
|
||||
|
||||
void Health::damage(int amount) {
|
||||
this->health -= amount;
|
||||
this->emit_signal("damage", amount, this->health);
|
||||
this->emit_signal("health_changed", -amount, this->health);
|
||||
if(this->health <= 0) {
|
||||
this->emit_signal("death", amount);
|
||||
}
|
||||
}
|
||||
|
||||
void Health::heal(int amount) {
|
||||
this->health = std::min(this->health + amount, this->max_health);
|
||||
this->emit_signal("health_changed", amount, this->health);
|
||||
this->emit_signal("heal", amount, this->health);
|
||||
}
|
||||
|
||||
int Health::get_health() const {
|
||||
return this->health;
|
||||
}
|
||||
|
||||
void Health::set_max_health(int max_health) {
|
||||
this->max_health = std::abs(max_health);
|
||||
}
|
||||
|
||||
int Health::get_max_health() const {
|
||||
return this->max_health;
|
||||
}
|
||||
}
|
30
src/health.hpp
Normal file
30
src/health.hpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
#ifndef HEALTH_HPP
|
||||
#define HEALTH_HPP
|
||||
|
||||
#include <godot_cpp/classes/node.hpp>
|
||||
|
||||
namespace godot {
|
||||
class Health : public Node {
|
||||
GDCLASS(Health, Node);
|
||||
static void _bind_methods();
|
||||
public:
|
||||
virtual void _enter_tree() override;
|
||||
void damage(int amount);
|
||||
void heal(int amount);
|
||||
|
||||
int get_health() const;
|
||||
void set_max_health(int max_health);
|
||||
int get_max_health() const;
|
||||
private:
|
||||
int health{1};
|
||||
int max_health{1};
|
||||
};
|
||||
|
||||
class IHealthEntity {
|
||||
public:
|
||||
virtual Health *get_health() = 0;
|
||||
virtual Health const *get_health() const = 0;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // !HEALTH_HPP
|
|
@ -9,6 +9,7 @@
|
|||
#include "utils/level.hpp"
|
||||
#include "utils/player_input.hpp"
|
||||
#include "utils/spawn_point.hpp"
|
||||
#include "health.hpp"
|
||||
#include "player_character.hpp"
|
||||
#include "tunnels_game_mode.hpp"
|
||||
#include "tunnels_player.hpp"
|
||||
|
@ -30,6 +31,7 @@ void initialize_gdextension_types(ModuleInitializationLevel p_level)
|
|||
ClassDB::register_class<TunnelsGameMode>();
|
||||
ClassDB::register_class<TunnelsPlayer>();
|
||||
ClassDB::register_class<PlayerCharacter>();
|
||||
ClassDB::register_class<Health>();
|
||||
}
|
||||
|
||||
extern "C"
|
||||
|
|
Loading…
Reference in a new issue