Wybór najlepszego sposobu rysowania figur szachowych

0

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

Oczywiście że lepsza jest jedna kontrolka.
Masz różne wyjścia:

  1. 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
  2. Tworzysz Rysownika, który odpowiada za rysowanie figury i przekazujesz mu kolekcję figur do narysowania.
  3. 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!

1 użytkowników online, w tym zalogowanych: 0, gości: 1