Projekt mapy, zorientowany obiektowo - co powinno być w klasie mapy?

0

Myślę nad projektem mapy w c++, zorientowany obiektowo. Nie istotne czy wczytywany z pliku, czy generowany losowo.
Wymyśliłem coś takiego:

class pole
{
private:
int ID;
int symbol; //w konsoli np. jakiś symbol reprezentujący, albo bitmapa.
int flag;
bool coolision;
public:
virtual void changes() = 0; //jakies akcje zachodzące w czasie na danym polu, np. jak sadzonka rośnie.
}

class tree : public pole //no i nowa klasa dla każdego pola, dla drzew,dla wody,dla kamieni itd.
{
private:
int wytrzymałość;//przykładowo tutaj dodaje wytrzymałość, np. ile uderzeń zanim drzewo zniknie.
public:
virtual void changes(){};
}

class mapa
{

}

Co według was powinno być w klasie mapa ?
Np. jeśli zrobimy generowanie losowe, to metoda generująca, ale potem do jakiego typu tablicowego mapy przypisywać te obiekty.
vector <typ> obiekt;

0

Myślę że jest OK jeśli chodzi o samą hierarchię. Główna klasa Mapa, która zawiera obiekty typu Pole (w jakiejś tablicy dwuwymiarowej, której indeksy mają przełożenie na pozycję Pola, w przeciwnym wypadku lepiej użyć czegoś z mniejszą złożonością operacji get (ale to też tylko gdy tych obiektów są tysiące a nie kilkadziesiąt)). Każde Pole to klasa bazowa dla konkretnych pól, np. typu Tree. Z tym że nie wiem czy klasa Mapa powinna mieć metodę generującą, czy to nie powinna być jakaś osobna klasa GeneratorMap. Nad tym trzeba by się zastanowić. Co do tego co powinno być w klasie Mapa to oczywiście jakiś getter dla konkretnych pozycji na mapie. Reszta wyjdzie w praniu.

0

Jak to obiekty typu Pole, przecież to jest klasa abstrakcyjna, nie można do niej tworzyć obiektów. Ewentualnie tablica wskaźników typu Pole, ale potem każdy z nich ustawić na klasę pochodną ?

0

Ja proponuje rozwiązanie z użyciem funkcji wirtualnych:

#include <iostream>
#include <vector>


class thing {};

class field
{
public:
  virtual void affect(thing& object) {}

};

class tree 
  : public field
{
public:
  void affect(thing& object) 
  {
    std::cout << "It works!" << std::endl;
  }

};

class map
{
public:
  map()
  {
    fields_.push_back(new tree);

    thing object;
    for (const auto& field : fields_) {
      field->affect(object);
    }
  }

private:
  std::vector<field*> fields_;

};


int main(void)
{
  map m;
  return 0;
}
0

A dobrym pomysłem jest stworzenie metody wirtualnej dla obiektów, które posiadają w środku komendę wyświetlającą daną bitmapę w współrzędnych pobranych z prywatnego bloku klasy ? I potem w klasie mapa była by funkcja, która leci przez wszystkie pola tablicy wskaźników, sprawdza na co wskazuję i wywołuję daną funkcję rysującą bitmapę ?

0

ja chyba bym z klasy mapa zrobił dokładnie jedną klasę, która by była tablicą kilku (2,3) wymiarową samych intów, gdzie int to ID. Druga klasa by miała mapowanie z ID na właściwości tego pola: (bitmapa, czy_blokuje itp., akcja).
Samą mapę bym zrobił tak:

typedef int IdType;
template<class FieldType = IdType>
struct Map
{
private:
    FieldType* Data; // jednowymiarowa - indeksy implementujesz w stylu x*height + y
public:
  Map(size_t width, size_t height);
  // tutaj deskturktor, konstruktory kopiujace, move konstruktory itp...
  FieldType& GetField(size_t x, size_t y); // (albo dać bezpośredni dostęp do Data + funkcje pomocnicze)
  const Height; // chyba, że planujesz mapy które nie mają stałych rozmiarów, jeśli rozmiar znany w trakcie kompilacji to można w template wrzucic Width i Height
  const Width;
};

Dlaczego tak? Mapa to najniższy poziom w Twojej grze i musi działać szybko.

Raczej bym się skupił na MapCreator, który by tą strukturę wypełniał. W nim bym zrobił, żeby przyjmował tylko strumień, jak ktoś chce mieć plik to strumień będzie plikiem, jak z pamięci to MemoryStream czy coś w ten deseń.

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