#ifndef ENGINE_SHAPE_H #define ENGINE_SHAPE_H #include "base/vecmath.h" #include "engine/drawable.h" namespace eng { class Animatable : public Drawable { public: Animatable() = default; ~Animatable() override = default; void Translate(const base::Vector2f& pos); void Scale(const base::Vector2f& scale); void Scale(float scale); void Rotate(float angle); void SetPosition(const base::Vector2f& pos) { position_ = pos; } void SetSize(const base::Vector2f& size) { size_ = size; } void SetTheta(float theta); base::Vector2f GetPosition() const { return position_; } base::Vector2f GetSize() const { return size_ * scale_; } float GetTheta() const { return theta_; } base::Vector2f GetRotation() const { return rotation_; } // Pure virtuals for frame animation support. virtual void SetFrame(size_t frame) = 0; virtual size_t GetFrame() const = 0; virtual size_t GetNumFrames() const = 0; virtual void SetColor(const base::Vector4f& color) = 0; virtual base::Vector4f GetColor() const = 0; void PlaceToLeftOf(const Animatable& s) { Translate({s.GetSize().x / -2.0f + GetSize().x / -2.0f, 0}); } void PlaceToRightOf(const Animatable& s) { Translate({s.GetSize().x / 2.0f + GetSize().x / 2.0f, 0}); } void PlaceToTopOf(const Animatable& s) { Translate({0, s.GetSize().y / 2.0f + GetSize().y / 2.0f}); } void PlaceToBottomOf(const Animatable& s) { Translate({0, s.GetSize().y / -2.0f + GetSize().y / -2.0f}); } protected: base::Vector2f position_ = {0, 0}; base::Vector2f size_ = {1, 1}; base::Vector2f scale_ = {1, 1}; base::Vector2f rotation_ = {0, 1}; float theta_ = 0; }; } // namespace eng #endif // ENGINE_SHAPE_H