// Geom. Objekte: Statische Member: Automatischer Farbkreis
// Header für abstrakte Basisklasse "GraObj"
//
// Klaus Kusche, 2020

#ifndef _GRAOBJ_H
#define _GRAOBJ_H

#include "color.h"

class GraObj
{
  public:
    GraObj(const Color &color, int x, int y, int w, int h,
          int sx = 0, int sy = 0)
    : mRGB(color), mX(x), mY(y), mW(w), mH(h), mSX(sx), mSY(sy)
    {}

    GraObj(const GraObj &orig)
    : mRGB(),  // Standard-Konstruktor statt Kopie der Original-Farbe
      mX(orig.mX), mY(orig.mY), mW(orig.mW), mH(orig.mH),
      mSX(orig.mSX), mSY(orig.mSY)
    {}

    virtual ~GraObj() { }

    virtual GraObj *clone() const = 0;

    Color getColor() const { return mRGB; }
    int getX() const { return mX; }
    int getY() const { return mY; }
    int getW() const { return mW; }
    int getH() const { return mH; }
    int getSX() const { return mSX; }
    int getSY() const { return mSY; }

    void setColor(const Color &color)
    {
      mRGB = color;
      draw();
    }

    void setSpeed(int sx, int sy)
    {
      mSX = sx; mSY = sy;
    }
    
    void setPos(int x, int y);
    void move(int dx, int dy);
    void setSize(int w, int h);
    void scale(int percentX, int percentY);

    bool fly(bool bounce = false);

    virtual void draw() = 0;
    virtual void undraw() = 0;
  
  protected:
    Color mRGB;
    int mX, mY;
    int mW, mH;
    int mSX, mSY;
};

#endif
