Autor Wątek: Profesjonalna mapa.  (Przeczytany 2433 razy)

Offline HellCat

  • Użytkownik

# Luty 10, 2006, 16:17:20
Od razu mowie, ze nie chodzi mi o grafike!
Chodzi mi o zapis mapy. Konkretnie mapy 2D, w takich bardziej profesjonalnych projektach :)

Na poczatku zaczalem od zwyklej tablicy dwu wymiarowej, w kotrej po prostu kolejny element tablicy odpowiadal kolejnemu elementowi na mapie.
Ale szybko zaczelo mi to przeszkadzac.
Wiec dolozylem druga tablice, w ktorej zaczalem zapisywac "akcje" zwiazane z danym polem.
Ale tez pojawil sie problem, jak mam wiecej niz jedna akcje na polu .. mozna to rozwiazac, ale postanowilem poszukac innego rozwiazania... No, ale chyba nikt za duzo na ten temat nie pisze (zbyt oczywisty temat ? a moze nikt juz nie robi gierek z widokiem izometrycznym z mapa 2D  :P).

Dlatgo pytam sie tutaj :)
Moze, ktos ma cos fajnego na ten temat do powiedzenia ?
Moze jakis ciekawy algorytm przechowywania troche bardziej skomplikowanych map :)

Pzdr.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline counterClockWise

  • Użytkownik

# Luty 10, 2006, 17:00:40
Nie rozumiem po co wprowadziłeś drugą tablicę ?

Możesz trzymać w takiej tablicy przecież nawet ogromne klasy z wieloma metodami pomocniczymi, które mogą zawierać całą wielką hierarchię klas.
Taką tablica oczywiscie tez musi byc obudowana w jakiej klasie dostarczajacej fajnych interfejsów do zarzadzania taka mapą.
Potem tylko Serialize i po sprawie.

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Luty 10, 2006, 17:06:57
Można to zrobić w ten sposób, że robisz dwuwymiarową tablicę wskaźników. Jeśli wskaźnik == NULL, to dane pole nie zawiera żadnych akcji, jeśli zawiera on inną wartość, to jest to adres dynamicznej tablicy z akcjami. Proste i skuteczne.

Offline HellCat

  • Użytkownik

# Luty 10, 2006, 17:08:43
Dlatego byla druga tablica, bo jak pisalem, bylo to pierwsze podejscie do tego tematu :)

Ale teraz zaczne pisac to jako tablice zawierajaca obiekty opisujace dany "kafelek".
Bo serializacje w sumie mam juz zrobiona.


Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Luty 10, 2006, 18:23:55
Generalnie "mapa" gry składa się zwykle z dwóch elementów:
- terenu
- obiektów

Teren może być zapisany jako tablica pól, a każda komórka tej tablicy pamięta jakieś parametry (w najprostszym przypadku tylko rozmiar, w bardziej zaawansowanym jakieś dodatkowe rzeczy). Zamiast tablicy może być kolekcja jakiś obiektów-przeszkód, np. prostokątnych ścian, a każda z nich ma pozycję lewego-górnego i prawego-dolnego rogu. Tak się robi w grach 3D, że mapa to zbiór wielokątów. Teren może pozostawać niezmienny w czasie gry - tak jest prościej.

Obiekty natomiast to kolekcja obiektów różnego rodzaju (przydaje się tu programowanie obiektowe i dziedziczenie - hierarchia klas). Każdy obiekt ma pozycję, a także charakterystyczne dla swojego rodzaju atrybuty (np. życie, rodzaj broni).

Mnie się wydaje, że to czego potrzebujesz teraz to nauka struktur danych. Polecam np. mój artykuł http://programex.risp.pl/?strona=strukturyd_formatyp. Poza tym przyda się znajomość programowania obiektowego.

Offline HellCat

  • Użytkownik

# Luty 10, 2006, 18:45:23
@ Regedit dzieki za arta. Przyda sie na pewno!
W sumie to co napsiales mam prawie napisane, musze to tylko poskladac w jedna calosc.

Ale mam jeden problem, ktorego nie moge przeskoczyc.
Cala mape laczy klasa Map (wiem ze malo oryginalne, ale co tam :P)
Zawiera ona funkcje do zabawy z mapa jak i zawiera tablice obiektow klasy Field.

I teraz dla uproszczenia sobie zycia, chcialem dodac do klasy Map przeciazony operator [] (nie wiem, czy zapisalem to poprawnie stylistycznie, ale chyba wiadomo o co mi chodzi :P)
Ale nie wyszlo. No to szybciutko otworzylem Symfonie i zaczalem czytac ..ale tam nie ma dokladnie opisanego takiego przypadku :( (co jedynie operator +,-, &, *, << i >>)

Moze ktos pomoc ? :)

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Luty 10, 2006, 22:20:23
Piszę z pamięci, więc nie wiem czy na pewno dobrze, ale to chyba będzie jakoś tak (kod wewnątrz klasy):

Field & operator [] (int Index)
{
  return m_Fields[Index];
}

Zwraca referencję żeby można też było modyfikować zwrócone pole, czyli używać po obydwu stronach przypisania zupełnie jak tablicy.

Nie da się przeciążyć operatora [] dla dwóch argumentów (indeksowanie X,Y), ale da się to zrobić dla operatora (), więc możesz przeciążyć ten operator i wtedy używać swojej mapy indeksując ją w taki dziwny sposób:

MyMap(1, 4) = Field(...);
Albo w ogóle tego nie robić - przecież wystarczy zwykła metoda dostępowa, przeciążanie operatora to tylko taki bajer.

Zastanawiam się po co klasa reprezentująca pojedyncze pole mapy. Co w nim przechowujesz? Czy to przypadkiem nie jest tylko jedno albo kilka pól bez żadnych metod?


Offline HellCat

  • Użytkownik

# Luty 11, 2006, 20:18:24
Zalozenie na klase Field, bylo takie:
-Przechowuje info o obrazku (wskaznik na bitmapke)
-obsluguje wszelkie zdarzenia zwiazane z polem, np: gracz wskoczyl na pole, jesli to "kolce" to gracz = trup,
Tak to jakos sobie myslalme  ::)

Ale w sumie, mozna to zastapic struktura a te funkcje umiescic juz w klasie Map.
HEhe, nie mam duzego doswiadczenia :P wiec nie wiem na na razie co bedzie najlepsze ;)


Pzdr.