Autor Wątek: Zapis / odczyt trochę bardziej skomplikowanej mapy 2D ;-)  (Przeczytany 1639 razy)

Offline BTM

  • Użytkownik

# Lipiec 26, 2008, 12:03:29
Nadszedł czas, w którym wypadało by skupić się na możliwości zapisywania / wgrywania map do mojej gierki.

O ile wiem jak można to zrobić w przypadku wyłącznie prostych obiektów (położenie obiektu na tilemapie, położenie na planszy X i Y) o tyle w moim wypadku, kiedy np. obiekt może posiadać wskaźnik do innych obiektów typu CollisionReaction, np: GenericObject *coin = new GenericObject();
coin->loadImage("resources\\coin.bmp");
coin->posX = 860;
coin->posY = 164;
coin->src.x = coin->src.y = 0;
coin->animate(4, 250);
coin->registerCollisionReaction(new CollisionDestroy());
scene->registerObject(coin);
Czy też nawet więcej reakcji na kolizję:block->registerCollisionReaction(new CollisionReveal(32, 0)); // pokaz, poprzez przesuniecie wskazana na tilemapie o 32px w osi X
block->registerCollisionReaction(new CollisionBounce(0, 1)); // odbij wzdluz osi Y
block->attachObject(bubble1); // dodaj dymek z tekstem do obiektu
sprawa się nieco komplikuje.

Jedyne co w tym momencie mi przyszło do głowy, to zapisywanie całej mapy do XML'a, ale wydaje mi się to nieco upierdliwą robotą + zajmować będzie trochę miejsca ;-)

Powiem szczerze, że nie wiem jak wygląda proces serializacji / deserializacji w C++ ale to chyba też mogło by być dobre rozwiązanie?

Offline Mr. Spam

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

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Lipiec 26, 2008, 12:36:01
Jednym ze sposobów jest stworzenie interfejsu do serializacji. Zawierałby on jakieś metody Serialize i Deserialize, które każdy zapisywany obiekt musiałby implementować. Implementacja polegałaby na wrzuceniu danych do strumienia wyjściowego (dla danych typu POD) albo na wywołaniu Serialize dla bardziej złożonych obiektów tudzież wskaźników na nie. Czyli coś w rodzaju:

Kod: (cpp) [Zaznacz]
class Class : public ISerializable
{
 int a;
 string s;
 COtherClass* obj;

 virtual void Serialize (void)
 {
  stream << a << s << obj->Serialize();
 }
};

Offline Karczas

  • Użytkownik
    • DevBlog

# Lipiec 26, 2008, 12:41:03
Myślę, że XML właśnie do takich zastosowań (między innymi) został stworzony ;)
Nawet jeżeli chciał byś zrobić to inaczej, to pewnie bez jakiejś formy znaczników ciężko było by się obejść więc na jedno wychodzi.
Zawsze można też w jednym miejscu (pliku lub jego części) zlistować wszystkie obiekty wraz z podstawowymi parametrami, a w innym miejscu tylko relacje, które między obiektami zachodzą - oczywiście należało by nadać tym obiektom jakieś unikalne numerki ID co znacznie ułatwi sprawę ;)
A może po prostu zaprzęgnąć do tego jakąś bazę danych i mapy oraz obiekty trzymać w tabelach??? Firebird w wersji embedded jest bardzo fajny - mało zajmuje przede wszystkim i nie trzeba instalować poza wgraniem jakichś dll'ek ;) Ale może to już przerost formy nad treścią ?:)

Offline BTM

  • Użytkownik

# Lipiec 26, 2008, 12:50:54
A może po prostu zaprzęgnąć do tego jakąś bazę danych i mapy oraz obiekty trzymać w tabelach??? Firebird w wersji embedded jest bardzo fajny - mało zajmuje przede wszystkim i nie trzeba instalować poza wgraniem jakichś dll'ek ;) Ale może to już przerost formy nad treścią ?:)
Tak, to już chyba przerost formy nad treścią - do mojej prostej gry 2D chyba aż takiego rozwiązania nie potrzeba :D

Aktualnie testuje rozwiązanie z XML - dokładniej tworze sobie XML i wychodzi mi np. coś takiego:

<Map>
<Background>
<Img src="resource//palm.bmp" x="0" y="0" />
<Pos x="0" y="-8" />
</Background>

<Foreground>
<Item>
<Img src="resources//tileset.bmp" x="192" y="96" />
<Pos x="264" y="168" />
</Item>
<Item>
<Img src="resources//tileset.bmp" x="224" y="96" />
<Pos x="296" y="168" />
</Item>
</Foreground>

<Objects>
<Item>
<Img src="resources//coin.bmp" x="0" y="0" />
<Pos x="860" y="164" />
<Animate frames="4" speed="250" />
<CollisionReactions>
<Reaction type="CollisionDestroy" />
</CollisionReactions>
</Item>
</Obects>
</Map>
Myślę, że idzie w dobrym kierunku.

Tym niemniej, inne pomysły dobrze widziane.

Złośliwiec - dzięki za podparcie mnie w pomyśle o serializacji, będę musiał o tym więcej poczytać (na razie serializowałem tylko w PHP :P)

Offline maro

  • Użytkownik

# Lipiec 26, 2008, 15:57:43
Jeśli to taka "prosta gra 2D", to można jakoś te obiekty podzielić na kategorie/typy, a do kategorii/typów przypisać zdarzenia.
Np. typy: block, coin, itd.. gdzie każdy z nich miałby wcześniej ustalone reakcje na kolizje, czy animacje. Przy ładowaniu pobierało by się wpółrzędne i typ obiektu, a całą resztę wykonywała by funkcja tworząca scenę.


Czyli w XML:
<Item>
<Type="coin"/>
<Pos x="296" y="168" />
</Item>

A skoro obiekt jest typu "coin", to dalej wiadomo już jakie ma mieć tileset, frames, speed, collisionreaction.

Offline Dab

  • Redaktor
    • blog

# Lipiec 26, 2008, 16:07:00
Do prostej gry 2D może wystarczyć prostszy format:

coin 20 40
coin 21 40
enemy 24 40 "verybad; muchhp"

Offline BTM

  • Użytkownik

# Lipiec 26, 2008, 16:18:31
Do prostej gry 2D może wystarczyć prostszy format:

coin 20 40
coin 21 40
enemy 24 40 "verybad; muchhp"
Więc załóżmy, że nie jest to "prosta gra"