#ifndef ENTITY_H_ #define ENTITY_H_ #include #include #include #include "constants.h" #define ENTITY_ACTIVE 1 #define ENTITY_COLLISION_ACTIVE (1 << 1) #define ENTITY_VISIBLE (1 << 2) #define ENTITY_ANIMATED (1 << 3) enum entity_type { Player_Entity }; enum draw_layer { Foreground_Layer, Background_Layer }; enum direction { Direction_Up, Direction_Down, Direction_Left, Direction_Right }; struct animation { int frame_count; bool is_looping; bool is_completed; Rectangle source_rects[ANIMATION_MAX_FRAMES]; float frame_times[ANIMATION_MAX_FRAMES]; int current_frame; float current_frame_time; }; void update_animation(struct animation* animation, float dt); Rectangle get_current_srcrect(const struct animation* animation); struct entity { int entity_id; enum entity_type type; uint32_t flags; Vector2 position; //The position of the entity(roughly the center) Vector2 velocity; Rectangle collider; Texture texture; Rectangle sprite_source_rect; //Used if entity doesn't have sprite animations Rectangle sprite_dest_rect; //Relative to the position of entity (roughly the center) struct animation animations[ENTITY_MAX_ANIMATIONS]; int current_animation; enum draw_layer draw_layer; }; void update_entity(struct entity* entity, float dt); void draw_entity(const struct entity* entity); Rectangle get_entity_collider_world(const struct entity* entity); void entity_handle_collision ( struct entity* self, struct entity* other, enum direction collision_direction ); void add_entity(const struct entity* e); static inline bool entity_active(const struct entity* e) { return (e->flags & ENTITY_ACTIVE) != 0; } static inline bool same_entity(const struct entity* a, const struct entity* b) { return a->entity_id == b->entity_id; } static inline bool entity_visible(const struct entity* e) { return (e->flags & ENTITY_VISIBLE) != 0; } #endif