Ho la seguente configurazione in una libreria della GUI che sto realizzando (per divertimento). Ignora i colori e le posizioni come numeri interi, serve solo a scopo di illustrazione.
// Example program
#include <iostream>
#include <string>
class Rect
{
public:
virtual void Draw(const int position) const = 0;
};
class ColorRect : public Rect
{
public:
virtual void Draw(const int position) const override
{
/* does a draw */
}
int color;
};
class TextureRect : public Rect
{
public:
virtual void Draw(const int position) const override
{
/* does a draw textured */
}
int texture;
};
class Widget
{
public:
Rect* background;
int position;
virtual void Draw() const
{
background->Draw(position);
}
virtual void Update()
{
/* might do stuff */
}
};
class Button : public Widget
{
public:
virtual void Draw() const override
{
Widget::Draw();
border->Draw(position);
}
Rect* border;
};
int main()
{
ColorRect redRect;
redRect.color = 1;
ColorRect blueRect;
blueRect.color = 2;
TextureRect textRect;
textRect.texture = 1;
Button b1;
b1.border = &blueRect;
b1.background = &redRect;
b1.position = 1;
Button b2;
b2.border = &blueRect;
b2.background = &textRect;
b2.position = 2
while(true)
{
b1.Update();
b2.Update();
b1.Draw();
b2.Draw();
}
}
Penso che dovrebbe essere ovvio che la classe Rect
sia un peso mosca che viene utilizzato da più oggetti diversi allo stesso tempo.
Quello che voglio fare ora, ad esempio, è avere b1
animare il suo confine Rect
. Questa animazione non dovrebbe influenzare l'altro Widget*
s che usa lo stesso Rect*
, cioè la loro animazione deve essere messa in pausa, avviata e avere un "frame corrente" diverso. Sono riluttante a creare una classe "Animated Rect" o qualcosa del genere, perché in questo caso l'unico modo per gestire un'animazione separata è che la classe mantenga una mappa di puntatori su Widget
s che la sta usando o qualcosa del genere.
Inoltre; Vorrei anche animare, per esempio, la posizione. Ciò significa che idealmente l'interfaccia che usi per animare le posizioni (che sono specifiche per l'oggetto), è uguale a quella usata per animare la trama o il colore (che è attualmente condivisa tra gli oggetti).
Qualunque cosa sia in grado di mantenere lo stato Animazione dovrebbe contenere alcune cose come frame_rate
e probabilmente time_since_updated
o qualcosa del genere.
Non riesco a capire dove metterlo o cosa riorganizzare per adattarlo.