Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Parsowanie różnych plików XML do różnych klas / planowanie klas i całego programu pod używanie XMLów

Ostatnio zmodyfikowano 2019-04-22 20:56
Autor Wiadomość
rafallauterbach
Temat założony przez niniejszego użytkownika
Parsowanie różnych plików XML do różnych klas / planowanie klas i całego programu pod używanie XMLów
» 2019-04-20 17:59:02
Witam.

W skrócie - Szukam jakichś "design paternów" jak używać XML'ów jak zrobić klasy tak, żeby dobrze z nimi współgrały i jak je wczytywać, tak żeby się nie powtarzać 1000 razy, żeby całość była szybka i wygodna w odczycie.

Poniżej więcej info jak zaplanowałem to u mnie teraz.


Pisząc grę dotarłem do momentu gdy postanowiłem, że zacznę wczytywać z plików XML wszystko co wyda mi się sensowne, żeby tam umieścić. Samo wczytywanie nie sprawia mi żadnego problemu i przygotowałem już sobie kilka plików XML, żeby z nimi popracować jak wymyślę sensowny schemat wg którego będę działać. Mam jednak problem ze strony projektu/designu. Wolałbym nie tworzyć dla każdej (wczytywanej z XML'a) klasy nowej metody w jakiejś klasie np. XML_Parser.


Wytnę niektóre elementy i spróbuję napisać uproszczony model tego jak sobie zaprojektowałem grę do tej pory.


Legenda :
-posiada
*posiada wskaźnik na
// koment

// Bank - to mój template, w zasadzie po prostu std::map<std::string name,T*>, gdzie T to element w <> . Jest jednak obudowany w metody, które chronią mnie samego przed pomyłkami - np jak próbuję odczytać element mapy, którego nie ma, to mam odpowiedni LOG(...), jak próbuję zapisać pusty element/zapisać element bez nazwy itp to też wszystko leci do LOGu

// Jest dużo elementów, które pomijam dla uproszczenia. Nie mają nic wspólnego z xmlami - np Client/Window/GUI/mapDisplay/Scene(s)

// Client ma Bank<Image> - obrazy będą wspólne dla wszystkich okien i sesji gry

GUI
// zawiera rózne elementy (Button, mapDisplay), które potrzebują sporej komunikacji z rzeczami po serwerowej stronie i dosyć leniwie bezpośrednie wskaźniki do wszystkiego co potrzebne. I tak powinno się zmieniać target używając set_target, więc wskaźniki nie powinny być nieaktualne.
-set_target(std::string server_name,std::string world_name)
*Active_Server
*Active_World // = &(Active_Server.active_World)
*Map // = &(Active_World.gMap)
-Bank<Scene>
*active_Scene
*Bank<Image>
*SDL_Renderer

Image
*SDL_Texture
-funkcje rysujące/wczytujące itp

Server
*active_World
-Bank<World>

World
-Map
-Bank<Tile_type>
-Bank<Resource>
-Bank<Settlement_type>

Map
-Vector<Tile>

Tile
-Settlement
*Tile_type

Settlement
*Settlement_type
-std::map<Resource*,int>

Tile_type
*Image
-jakieś modyfikatory

Settlement_type
*Image
-...


w uproszczeniu folder to
/
.exe
/img
obrazki.png
(...)
/xml
tile_type.xml
settlement_type.xml
(...)
image.xml // jedyny plik, który nie będzie kopiowany do save'a . Ścieżki i nazwy np <name>IMG_BUTTON</name><path>/img/button.png</path>
/save
/new_world
/map
map.xml // plik z podstawą mapy - podstawowe definicje pól i
settlements.xml //miasta i ich koordynaty. Nanoszone po wczytaniu poprzenidego pliku
armies.xml // podobnie jak z miastami
tile_type.xml //jeżeli coś się zmieni w grze, to chciałbym, żeby save pozostawał w wersji, w której powstał. Jak przestanie być kompatybilny z nową wersją gry... Cóż, może zapisze też wersję gry dla save'a
settlement_type.xml // tak jak powyżej
(...) // wszystko co w xml



Teraz chcę wczytać Tile_type/Resource/Settlement_type z XMLów. Na początku myślałem, żeby zrobić klasę XML_Parser i w niej zaincludować wszystkie klasy, które chcę wycztywać/zapisywać do XMLa, później do każdej klasy napisać osobną metodę do zapisywania i wczytywania każdego rodzaju klasy ale pomyślałem, że szybko powstanie mi jakiś potwór z tego, w którym 90% kodu będzie się powtarzać w każdej metodzie, w dodatku przy każdej poprawce będzie się długo kompilować, ale nie jestem pewien, może jakby go usprawnić jakoś to ten pomysł nie byłby zły.

Drugi mój pomysł to było dziedziczyć wszystko z jakiegoś typu, który byłby kompatybilny z XMLem, tylko nie wiem w sumie co sam przez to rozumiem i jak go wymyślić. I wtedy po prostu XML_Parser wczytywałby/zapisywał XMLe do i z tego typu.

Na penwo będę mapę wczytywał osobną metodą w XML_Parserze, bo jest dość specyficzna i nie zawiera "modeli" tylko konkretne już obiekty. Wymyśliłem, że łatwiej niż zapisywać każde pole bardzo dokładnie to zapisać sobie kilka wzorców pola (1-pustynia,2-ocean,3-trawa,4-pustynia z elewacją,5-las z plemieniem) i potem po prostu zapisać mapę w formacie ~
030140035010
055010240201
531004301010
żeby się nie powtarzać za dużo, gdy dużo pól jest takich samych. Chociaż co do tego pomysłu tez nie jestem pewien. Bo chyba będzie to kosztować czas CPU (trzeba sprawdzać, czy ten element jest dokładnie taki sam jak ten zapisany) i pogroszy jakość kompresjii, a jeżeli w przyszłości będę się decydował na kompresję save'ów to wtedy nie ma sensu zapisywać podobnych fragmentów i je zastępować prostymi symbolami, bo właśnie tak działa kompresja (z tego co mi wiadomo).

Uciekając od mapy gry i wracając do bardziej "modelowych" typów. Wiem też że istnieje też schemat XML który pozwoliłby mi dodawać nazwy i typy zmiennych i dodatkowo sprawdzać poprawność XMLa, ale nie wiem jak mógłbym użyć go tak, aby mieć wygodny dostęp do elementów i nie zapisywać wszystkiego w dynamicznych zmiennych. Wolałbym, żeby moje klasy te miały statyczne pola, w które będę zapisywał sobie odpowienie dane. Gubię się jak zaczyna wchodzić do klasy za dużo abstrakcji i dynamicznych zmiennych.


Nie wiem, czy nie zauważyłem po prostu jakichś prostych rozwiązań. A może to co wymyślam to już momentami dobre pomysły.
A może ktoś ma już podobne doświadczenie i chciałby się podzielić tym jak to zrobił?
P-174477
pekfos
» 2019-04-21 19:00:58
A może ktoś ma już podobne doświadczenie i chciałby się podzielić tym jak to zrobił?
Ja bym to po prostu zrobił i Tobie radzę to samo. Po prostu zrób prototyp na tych paru XMLach, które masz i zobacz jakie są problemy. Iteracyjnie dojdź do czegoś satysfakcjonującego. Takim gdybaniem narażasz się na wymyślenie czegoś dobrego na papierze, ale niepraktycznego w rzeczywistości. Piękny plan się sypnie na czymś, czego nie przewidziałeś.
Na pewno chcesz sobie zadawać takie pytania jak
  • Jaki jest czas życia informacji wczytanej z XMLa? Cały program? Aktualny poziom w grze? Jeden obiekt?
  • Jaki jest zasięg informacji z XMLa? Wszystkie obiekty danego typu, czy wybrane?
  • Jak można zredukować powtórzenia w kodzie? To wpływa, jak wygodnie będzie się rozwijać kod.
  • Jak można zredukować powtórzenia w XML? To wpływa, jak wygodnie będzie się eksperymentować z różnymi ustawieniami, bo raczej będziesz to robić, mając je w osobnym pliku.
P-174480
rafallauterbach
Temat założony przez niniejszego użytkownika
» 2019-04-22 20:56:15
Chyba najlepiej jak jakoś to zrobię i najwyżej poprawię. Zastanowiłem się już w sumie nad każdym z tych pytań, choć może ich tak nie sformułowałem.
Ostatnio musiałem przepisywać bardzo duże części kodu, bo wpadłem na inny pomysł jak ułożyć wszystko, ale parsowanie plików do klas to chyba zbyt indywidualny temat, żeby go zaplanować tak od góry i połączyć we spólną metodę. Napiszę idywidualny parser dla każdej klasy.
P-174506
« 1 »
  Strona 1 z 1