diff options
Diffstat (limited to 'src/crepe/api/Sprite.h')
-rw-r--r-- | src/crepe/api/Sprite.h | 118 |
1 files changed, 100 insertions, 18 deletions
diff --git a/src/crepe/api/Sprite.h b/src/crepe/api/Sprite.h index bdb4da9..a2409c2 100644 --- a/src/crepe/api/Sprite.h +++ b/src/crepe/api/Sprite.h @@ -1,32 +1,114 @@ #pragma once -#include <SDL2/SDL_rect.h> -#include <cstdint> -#include <memory> +#include "../Component.h" +#include "api/Asset.h" -#include "api/Color.h" -#include "api/Texture.h" - -#include "Component.h" +#include "Color.h" +#include "types.h" namespace crepe { -struct FlipSettings { - bool flip_x = 1; - bool flip_y = 1; -}; +class SDLContext; +class Animator; +class AnimatorSystem; +/** + * \brief Represents a renderable sprite component. + * + * A renderable sprite that can be displayed in the game. It includes a texture, color, and + * flip settings, and is managed in layers with defined sorting orders. + */ class Sprite : public Component { +public: + //! settings to flip the image + struct FlipSettings { + //! horizantal flip + bool flip_x = false; + //! vertical flip + bool flip_y = false; + }; + + //! Sprite data that does not have to be set in the constructor + struct Data { + /** + * \brief Sprite tint (multiplied) + * + * The sprite texture's pixels are multiplied by this color before being displayed + * (including alpha channel for transparency). + */ + Color color = Color::WHITE; + + //! Flip settings for the sprite + FlipSettings flip; + + //! Layer sorting level of the sprite + const int sorting_in_layer = 0; + + //! Order within the sorting layer + const int order_in_layer = 0; + + /** + * \brief width and height of the sprite in game units + * + * - if exclusively width is specified, the height is calculated using the texture's aspect + * ratio + * - if exclusively height is specified, the width is calculated using the texture's aspect + * ratio + * - if both are specified the texture is streched to fit the specified size + */ + vec2 size = {0, 0}; + + //! independent sprite angle. rotating clockwise direction in degrees + float angle_offset = 0; + + //! independent sprite scale multiplier + float scale_offset = 1; + + //! independent sprite offset position + vec2 position_offset; + }; public: - Sprite(uint32_t game_id, std::shared_ptr<Texture> image, - const Color & color, const FlipSettings & flip); + /** + * \param game_id Unique identifier for the game object this sprite belongs to. + * \param texture asset of the image + * \param ctx all the sprite data + */ + Sprite(game_object_id_t id, const Asset & texture, const Data & data); ~Sprite(); - std::shared_ptr<Texture> sprite_image; - Color color; - FlipSettings flip; - uint8_t sorting_in_layer; - uint8_t order_in_layer; + + //! Texture used for the sprite + const Asset source; + + Data data; + +private: + //! Reads the mask of sprite + friend class SDLContext; + + //! Reads the all the variables plus the mask + friend class Animator; + + //! Reads the all the variables plus the mask + friend class AnimatorSystem; + + /** + * \aspect_ratio the ratio of the sprite image + * + * - this value will only be set by the \c Animator component for the ratio of the Animation + * - if \c Animator component is not added it will not use this ratio (because 0) and will use aspect_ratio of the Asset. + */ + float aspect_ratio = 0; + + struct Rect { + int w = 0; + int h = 0; + int x = 0; + int y = 0; + }; + //! Render area of the sprite this will also be adjusted by the AnimatorSystem if an Animator + // object is present in GameObject. this is in sprite pixels + Rect mask; }; } // namespace crepe |