latajacaryba Temat założony przez niniejszego użytkownika |
kontener do często sortowanych, niewiele zmieniających się danych. » 2018-03-07 02:27:35 Witam. Jestem w trakcie tworzenia mapy kafelkowej, w której obiekty są wyświetlane od góry do dołu tak, by obiekt który jest bliżej był wyświetlany później, Aby mógł ewentualnie zasłonić - już narysowane - obiekty w oddali. Oczywiście sprowadza się to do sortowania obiektów, na podstawie pozycji. Zastanawiam się, który kontener będzie najlepszy do przechowywania danych i ich sortowania. Tu jednak dochodzi ciekawa sprawa; większość obiektów, jak drzewo, dom, itp. będzie rzecz jasna statyczna i pozycja nie będzie się zmieniała, więc wydawałoby się, że wystarczy raz posortować np. vector tych obiektów i po kolei wyświetlać. Ale prócz tego, mamy również obiekty, które mogą się poruszać. Jest ich znacznie mniej i dlatego właśnie zastanawiam sie, jaki kontener zastosować. Jeśli na ekranie mamy np. 400 obiektów statycznych i 40 poruszających się, to czy warto sortować cały kontener od początku, czy lepiej sprawdzać, czy postać poruszając się przykładowo w dół, jest niżej od swojego sąsiada w kontenerze: bool czyGraczJestNizej = kontener[ indeksPostaci ].pozycja < kontener[ indeksPostaci + 1 ].pozycja;
Oczywiście wiązałoby się to z przesunięciem całego kontenera: [drzewo] [gracz] [drzewo] [domek] [doniczka] [beczka] [drzewo] [ ] [drzewo] [domek] [doniczka] [gracz] // gracz wchodzi na miejsce beczka, wszystkie obiekty przesuwają sie w dół [drzewo] [drzewo] [domek] [doniczka] [beczka] [gracz] Żeby było ciekawiej, obiekty mają różne priorytety (np ptak zawsze wyświetlany jest jako ostatni, bo swoim ciałem przysłania wszystko poniżej) więc je też trzeba wziąć pod uwagę. Z góry dziękuję za odpowiedzi :) |
|
jankowalski25 |
» 2018-03-07 07:44:47 Dlaczego chcesz trzymać obiekty z różnych warstw w jednym kontenerze? Może lepiej dla każdej warstwy tworzyć oddzielny kontener? Dzięki temu jesteś w stanie rysować poszczególne warstwy niezależnie od siebie i wtedy na końcu wystarczy tylko je wyświetlić jedna na drugiej w odpowiedniej kolejności. Dodatkowo, jeśli jakaś warstwa się nie zmieniła, to nie trzeba jej tworzyć w każdej klatce od zera, tylko wystarczy ją wyświetlić. |
|
geceves |
» 2018-03-07 09:52:57 Jeżeli koniecznie chcesz jeden kontener to przemyśl jakąś własną kolejkę priorytetową albo dorób zmianę priorytetu w std::priority_queue . To co chcesz osiągnąć to myślę, że najlepiej zrobić za pomocą prostej tablicy list jeżeli masz ustalony ciągły zakres liczby "warstw". Jeżeli zakres jest niezdefiniowany to możesz zejść z O(1) w określeniu warstwy do O(log n) za pomocą mapy list. Nie ma sensu tego sortować, obiekty mogą nawet same się "przepisywać" z listy do listy (wstrzyknąć im serwis "warstwowy" przez konstruktor), albo z jakimś zewnętrznym nadzorcą, który przy okazji "zdarzeń" będzie usuwał obiekt z jednej listy i dodawał na inną. Jeżeli obiektów będzie dużo możesz rozważyć zamianę listy na set. Ewentualnie użyć kontenerów haszowych i mieć jeszcze lepszą wydajność. |
|
pekfos |
» 2018-03-07 16:22:13 Obiekty statyczne trzymaj osobno, obiekty poruszające się sortuj między sobą. Wyświetlanie to scalanie dwóch posortowanych sekwencji. Chyba że koniecznie chcesz sobie utrudniać życie. W takim wypadku, padły już w temacie ciekawe opcje. Bardziej skomplikowane, mniej wydajne - czego tylko dusza zapragnie. |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2018-03-08 03:02:49 Dziękuję wam za odpowiedzi, niemniej jednak wydaje mi się, że sposób pekfosa jest tym, czego szukałem. Faktycznie, nie wpadłem na to, że można to rozdzielić na statyczne i dynamiczne, posortowac dynamiczne i scalić. Wplotę w to również ideę JanaKowalskiego25, mianowicie dla każdej warstwy będzie osobny kontener: class Warstwa { const int priorytet; std::vector < GameObject *> dynamiczne; std::vector < GameObject *> statyczne; void Sortuj(); void Wyswietl(...); }
I mamy jakiś manager wyświetlania, który sortuje sobie te warstwy po const int priorytet i wyświetla scalone wektory. Co o tym myslicie? |
|
latajacaryba Temat założony przez niniejszego użytkownika |
» 2018-03-13 23:58:23 Ups, zapomniałem o tym temacie :PP W każdym razie zrobiłem jak pisałem, dziękuję jeszcze raz i zamykam. |
|
« 1 » |