Cześć. Mam taki problem. Mam zrobioną grę w szachy w ten sposób że każda figura jest osobnym QWidgetem w Qt (figur jest 32 więc nie jest to dużym obciążeniem dla kompa). Wszystkie figury mają swoją metodę rysującą (nadpisują metodę paint(QPaintEvent*)). Wszystko fajnie działa ale zastanawiam się czy nie lepiej byłoby przenieść rysowanie do klasy wyświetlającej planszę (widoku) i nie byłoby wtedy tyle tych QWidgetów (tylko jeden QWidget planszy z metodą paint). Problem jest tylko taki że w tej chwili gdy figura się ruszy, wywoływana jest jedynie metoda paint tego jednego widgetu figury. Natomiast gdy przeniosę to rysowanie do klasy widoku planszy będę musiał iterować po wszystkich figurach i je wszystkie od nowa rysować. Które rozwiązanie jest lepsze?
0
0
Oczywiście że lepsza jest jedna kontrolka.
Masz różne wyjścia:
- W klasie Figura robisz metodę odpowiedzialną za rysowanie konkretnej figury, a referencje do wszystkich figur trzymasz w jakiejś kolekcji. Potem wywołujesz tę metodę dla każdego elementu kolekcji
- Tworzysz Rysownika, który odpowiada za rysowanie figury i przekazujesz mu kolekcję figur do narysowania.
- Możesz też cały kod wrzucić do metody paint, co będzie mało eleganckim rozwiązaniem, ale dalej lepszym, niż używanie kontrolek zamiast instancji klasy Figura.
0
Tak jak myślałem, dzięki. Jeszcze jedna rzecz: Nie chcę do widoku przekazywać tablicy z Figurami bo widok nie potrzebuje dostepu do tych figur. Chcę tylko przeslac pewien interfejs za pomoca ktorrego beda pobierane parametry figury:
Drawable (metoda draw)
^
|
|
Figure
^
|
|
Queen etc
Jest jakaś możliwość (funkcja w C++) konwertująca QVector<Figures*> do QVector<Drawable*> czy muszę zrobić osobny QVector<Drawable*> i osobno w nim umieszczac figury?
1
Niech figura implementuje Drawable, a potem działaj na kolekcji drawabli. Do tego mogą dojść inne drawable - ogólnie kolekcja rysowalnych rzeczy na ekranie.
Coś typu
List<Figure> f = ...
List<Drawable> dd = ... //nowa lista
dd.addAll(f) // bo Figura implementuje Drawable
class Plansza{
override paint(){
//dla każdego Drawable z dd wykonujesz draw()
0
Tak zrobiłem dzięki!