Gra 2D - Mapa Kafelkowa

0

Witam serdecznie, jestem w trakcie pisania prostej, arkadowej gry 2D. Zastanawiam się, jak dobrze ugryźć kwestie mapy. W głowie mam taką koncepcje. Tworze tablice dwuwymiarową o rozmiarze M x N, w której występują obiekty danego typu np. ściany/ punkty do zdobycia/ punkty kontrolne. Dla każdego typu będzie osobna tablica, tak aby powstały "warstwy". Te warstwy będą przechowywane w jakimś pojemniku np. wektorze. W pętli głównej chciałbym sprawdzać czy w obrębie jakiegoś bohatera gry jest jakiś obiekt, jeżeli jest to ściana zatrzymaj ruch bohatera lub czy jest na jakimś obiekcie np. punkcie kontrolnym lub punkcie do zdobycia . Z góry dziękuje za udział w dyskusji.

0

A nie lepiej zamiast kilku(nastu) tablic zrobić jedną ze strukturą w której będziesz miał tylko true bądź false w zależności czy dany obiekt tam jest czy nie?

0

Hm... nie bardzo widzę jak w takim rozwiązaniu w jednym punkcie (X,Y) umieścić kilka różnych obiektów.

0

Więc masz jeszcze za małą wiedzę by napisać grę.

1

Zastanow sie, czy nie warto przechowywac listy obiektow (badz mapy, w ktorej kluczem beda wspolrzedne). Przy malo wysyconej mapie (duzej przestrzeni, malej liczbie obiektow) bedzie to zabieralo znaczaco mniej pamieci kosztem dluzszego czasu dostepu.

Zdecydowanie tez sklanialbym sie w wypadku mapy NxM do trzymania struktur (obiekt, hashmapa) z wlasnosciami pola zamiast wielu tablic. W ten sposob za kazdym razem bedziesz pobieral jedna strukture i decydowal o dzialaniu gracza po sprawdzeniu pol w tej strukturze.

0

Krzysztofie po Twoim rozwinięciu myśli babubabu , skłaniam się ku takiej koncepcji. Muszę to przetrawić. Jeszcze mam dwa pytania. Jak podejść do kwestii kolizji z obiektami mapy, przy założeniu, że reakcja z jednymi obiektami jest gdy ich współrzędne się pokrywają, a z innymi gdy bohater jest przy jakimś obiekcie? Druga kwestia, jak podejść do kwestii wyszukiwania ścieżki? Wiem, że grafy a konkretnie algorytm Dijkstry sprawdza się przy takich problemach.

0

Zastanow sie, czy nie warto przechowywac listy obiektow (badz mapy, w ktorej kluczem beda wspolrzedne). Przy malo wysyconej mapie (duzej przestrzeni, malej liczbie obiektow) bedzie to zabieralo znaczaco mniej pamieci kosztem dluzszego czasu dostepu.

Dużo lepszym pomysłem byłoby użycie sparse matrix.
https://en.wikipedia.org/wiki/Sparse_matrix
http://stackoverflow.com/questions/390181/sparse-matrices-arrays-in-java

0

Jeszcze co do rozwiązania babubabu czy tworzenie takiej mapy nie jest upierdliwe? Czy po prostu zrobić plik tekstowy, na podstawie którego będzie tworzona lista?

0

jestem w trakcie pisania prostej, arkadowej gry 2D. Zastanawiam się, jak dobrze ugryźć kwestie mapy. W głowie mam taką koncepcje.
Tworze tablice dwuwymiarową o rozmiarze M x N, w której występują obiekty danego typu np. ściany/ punkty do zdobycia/ punkty kontrolne.
Dla każdego typu będzie osobna tablica, tak aby powstały "warstwy".
Te warstwy będą przechowywane w jakimś pojemniku np. wektorze.
W pętli głównej chciałbym sprawdzać czy w obrębie jakiegoś bohatera gry jest jakiś obiekt, jeżeli jest to ściana zatrzymaj ruch bohatera
lub czy jest na jakimś obiekcie np. punkcie kontrolnym lub punkcie do zdobycia

A pytanie brzmi jak? Gdzie leży problem?

0

Chodzi o ocenę rozwiązania oraz jak poradzić sobie z kolizjami w takiej mapie

0

Można to prosto zrobić tak, że każdy kafel ma informację, czy jest kolizyjny, czy nie. Na podstawie pozycji postaci łatwo wyliczyć kafle, dla których trzeba sprawdzić kolizje.

0

przy założeniu, że rozmiar obiektu jest równy wielkości kafla (czyli rozmiar obiektu 1x1, nie może istnieć sytuacja, gdzie obiekt jest większy, ma rozmiar np. 5x2 kafli, albo mniejszy, np. 0.1kafla), to wystarczy, że każdy kafel będzie miał listę obiektów, które na nim leżą (albo referencję do obiektu, jeśli na jednym kaflu miałby się znajdować tylko jeden obiekt). I przy ruchu na dany kafel pole docelowe sprawdzisz czy w polu docelowym są już jakieś obiekty, czy jest ono puste. (i jak już ktoś wspomniał, np. jakąś flagę na obiektach, czy koliduje). I samo to raczej jest proste, przy założeniu, że obiekty mają rozmiar 1x1 i poruszają się dyskretnie (tj. z pola na pole, bez stanów pośrednich).

Jednak problemy mogą się pojawić, jeśli masz np.:

  • obiekty o wymiarach większych niż wymiar kafla, albo o wielkości ułamkowej
  • obiekty, które się płynnie poruszają, albo po prostu są postawione pośrodku (np. zaczynają się w połowie kafla)
    (tj. załóżmy, że masz animacje, jeden kafel to np. 32 pikseli szerokości i 32 wysokości. Żeby zrobić płynną animację, nie będziesz mógł poruszać obiektami tylko z kafla na drugi kafel (chyba, że robisz szachy, czy coś innego, co nie wymaga płynności), a raczej będziesz musiał je animować po pikselach. Wtedy możesz się znaleźć w sytuacji, gdzie jakiś obiekt będzie zajmował 2 pola naraz). To też musiałbyś jakoś wziąć pod uwagę, co wtedy.
0

LukeJL tak u mnie jeden kafel jest przedstawiany obrazem o rozmiarze 32x32 piksele i zależy mi na płynnym przechodzeniu. Ponadto zdecydowałem się, żeby przechowywać na danej pozycji listę obiektów które tam się znajdują, jedyne co w tym rozwiązaniu napawa mnie pesymizmem to tworzenie mapy. Prawdopodobnie zdecyduje się, na generowanie jej z pliku tekstowego.

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