A rouge-like rpg, heavily inspired on the binding of isaac. Running on a FRDM-K64F Mbed board. C++.

Dependencies:   mbed MotionSensor

Entity/Entity.h

Committer:
el17sm
Date:
2019-05-09
Revision:
58:c8d90bb7404a
Parent:
57:1c12361b6e3d
Child:
59:fd4669864b67

File content as of revision 58:c8d90bb7404a:

#ifndef ENTITY_H
#define ENTITY_H
#include "sprites.h"
#include "math.h"
#include "N5110.h"

/**Entity Abstract Class
@author Steven Mahasin
@brief Creates an Entity which holds entity datas, functions(movements, damaged actions, collision test, etc), accessors and functions to be inherited by child classes
@date May 2019
*/
class Entity
{
protected:
    struct Hitbox {
        int width;
        int height;
    };
    struct SpriteSize {
        int width;
        int height;
        // Top-left corner of sprite is offset_x
        // to the right of top-left corner of hitbox
        int offset_x;
        // Top-left corner of sprite is offset_y
        // below of top-left corner of hitbox
        int offset_y;
    };
    struct Position {
        float x;
        float y;
    };
    struct FrameCount  {
        int count;
        int number;
        int max;
    };
    /**
    *   @brief A struct containing hitbox data for the entity
    *   @info width and height
    */
    Hitbox _hitbox;
    /**
    *   @brief A struct containing sprite size data for the entity, to be used when drawing sprites on top of their hitboxes
    *   @info sprite width, sprite height, sprite offset x from hitbox, sprite offset y from hitbox
    */
    SpriteSize _sprite_size;
    /**
    *   @brief A struct containing the position of the entity, this position is the top-left corner of the hitbox
    */
    Position _position;
    /**
    *   @brief A struct containing the position of the entity one loop behind
    */
    Position _prev_pos;
    /**
    *   @brief A struct containing frame count, frame number and frame max. Used to animate entities
    */
    FrameCount _frame;
    /**
    *   @brief The health point of an entity
    */
    int _hp;
    /**
    *   @brief The damage the entity does if it attacks another entity
    */
    int _attack;
    /**
    *   @brief The direction the entity is facing
    */
    int _face;
    /**
    *   @brief The speed the entity moves
    */
    float _velocity;
    /**
    *   @brief The chance(out of 100) of dropping a heart when the entity is deleted.
    */
    int _hp_drop_chance;

public:
    // Function
    /**
    *   @brief a virtual function movement of the entity to be inherited
    *   @param x_value @details either joystick x or player's x position
    *   @param y_value @details either joystick y or player's y position
    *   @param map @details the 2d map array that dictates where there are walls or empty space
    *   @param doorways @details an array that dictates which side of the wall has a doorway
    */
    virtual void move(float x_value, float y_value, char * map, bool * doorways) = 0; // movement control and miscellaneous updates
    /**
    *   @brief a virtual function of the action when taking damage to be inherited
    *   @param damage @details the amount of damage to be taken
    */
    virtual void take_damage(int damage) = 0;
    /**
    *   @brief a virtual function of drawing the entity to be inherited
    *   @param lcd @details the screen where the entity is drawn on
    */
    virtual void draw(N5110 &lcd) = 0;
    /**
    *   @brief a function to undo entity's movement in the x direction if condition is true
    *   @param condition @details a boolean statement
    */
    void undo_move_x(bool condition);
    /**
    *   @brief a function to undo entity's movement in the y direction if condition is true
    *   @param condition @details a boolean statement
    */
    void undo_move_y(bool condition);
    /**
    *   @brief updates the _prev_pos into _position
    */
    void update_prev_pos();
    /**
    *   @brief checks if the entity collides the map
    *   @param pos_x @details entity's x-position
    *   @param pos_y @details entity's y-position
    *   @param two_d_map @details the 2d map array that dictates where there are walls or empty space
    *   @param doorways @details an array that dictates which side of the wall has a doorway
    *   @return true if entity collide with the map
    */
    bool entity_to_map_collision_test(float pos_x, float pos_y, char * two_d_map, bool * doorways);

    // Mutator
    /**
    *   @brief mutates position of the entity to x and y
    *   @param x @details x-coordinate value
    *   @param y @details y-coordinate value
    */
    void set_position(float x, float y);
    /**
    *   @brief adds change_x onto x-position of the entity
    *   @param change_x @details displacement x
    */
    void position_add_x(float change_x);
    /**
    *   @brief adds change_y onto y-position of the entity
    *   @param change_y @details displacement y
    */
    void position_add_y(float change_y);
    
    // Accessors
    /**
    *   @brief gets the entity's chance to drop a health
    *   @return _hp_drop_chance
    */
    int get_hp_drop_chance();
    /**
    *   @brief gets the entity's hitbox width
    *   @return _hitbox.width
    */
    int get_hitbox_width();
    /**
    *   @brief gets the entity's hitbox height
    *   @return _hitbox.height
    */
    int get_hitbox_height();
    /**
    *   @brief gets the entity's face
    *   @return _face
    */
    int get_face();
    /**
    *   @brief gets the entity's sprite width
    *   @return _sprite_size.width
    */
    int get_sprite_width();
    /**
    *   @brief gets the entity's sprite height
    *   @return _sprite_size.height
    */
    int get_sprite_height();
    /**
    *   @brief gets the entity's sprite x-offset
    *   @return _sprite_size.offset_x
    */
    int get_offset_x();
    /**
    *   @brief gets the entity's sprite y-offset
    *   @return _sprite_size.offset_y
    */
    int get_offset_y();
    /**
    *   @brief gets the entity's x-position
    *   @return _position.x
    */
    int get_pos_x();
    /**
    *   @brief gets the entity's y-position
    *   @return _position.y
    */
    int get_pos_y();
    /**
    *   @brief gets the entity's previous x-position
    *   @return _prev_pos.x
    */
    int get_prev_pos_x();
    /**
    *   @brief gets the entity's previous y-position
    *   @return _prev_pos.y
    */
    int get_prev_pos_y();
    /**
    *   @brief gets the entity's attack
    *   @return _attack
    */
    int get_attack();
    /**
    *   @brief gets the entity's hp
    *   @return _hp
    */
    int get_hp();
    /**
    *   @brief gets the entity's velocity
    *   @return _velocity
    */
    float get_velocity();

};

#endif