Skocz do zawartości

Tuturial dziedziczenie


baca

Rekomendowane odpowiedzi

Upraszczanie sobie życia za pomocą dziedziczenia.

W tym tuturialu nie będę opisywał konkretnych elementów języka C++,

bo to nie jest moim celem. Zamierzam Pokazać jak w prosty sposób wykorzystać

dziedziczenie tworząc obiekt główny parent - („rodzic”) i przetwarzać go za pomocą tablicy.

 

1. Tworzymy nasz obiekt główny „Parent”:

 

class Parent
{
    public:
    int alarm[2];
    virtual void alarm0(){}
    virtual void alarm1(){}
    // współrzędne obiektu
    int x, y;
   // prędkość
   int hspeed, vspeed;
   // czy ma być wyświetlony
   bool show;
   // obrót
   float direction;
   // konstruktor
   Parent():x(0), y(0), hspeed(0), vspeed(0), direction(0), show(true){}
   Parent(int _x, int _y):x(_x), y(_y)
  {
      hspeed = vspeed = 0;
      direction = 0.0f;
      show = true;
   }
   // destruktor
   virtual ~Parent(){};
   // będzie uruchamiany na początku obiektu tylko raz
   // virtual powoduje że można funkcję można zdefiniować na nowo
   virtual void create(){}
   // będzie pracować do zakończenia programu
   virtual void step(){}
   // tą funkcje niebędzie można zmienić w nowym obiekcie
   void step_begin()
   {
       x += hspeed;
       y += vspeed;
    }
   // rysuje nasz objekt
   virtual void draw()
    {
        //draw_sprite(current_sprite, image_number, x, y);
    }
};

2. Teraz pokarzę jak tworzyć obiekty za pomocą rodzica.

 

class objects0 : public Parent
{
public:
void create()
{
  alarm[0] = 30;
    }
    void alarm0()
    {
        x+=30;
        alarm[1] = 30;
    }
    void alarm1()
    {
        x -= 30;
        alarm[0] = 30;
    }
};

class objects1 : public Parent
{
public:
void step()
{
  y++;
}
void draw()
    {
        // draw_point(x, y);
    }
};

3. Tworzymy obiekt główny mapy

 

class MapaParent
{
    //tutaj trzymamy nasze objekty
    // można skożystać z innych struktur, i chyba najlepszym jest lista
    // ale urzyję vectora bo jest moim zdaniem prosty w obsłudze
    std::vector<Parent*> obj;
    int id;
    public:
MapaParent():obj(NULL), id(0){}
virtual ~MapaParent(){};
void instance_create(int x, int y, Parent *_obj)
{
     obj.push_back(_obj);
     obj[id]->x = x;
     obj[id++]->y = y;
}
void create()
{
     // rysuje objekty mapy
     for(int i = 0; i<obj.size(); i++)
     {
                obj[i]->create();
     }
}

void step()
{
     for(int i = 0; i<obj.size(); i++)
     {
         obj[i]->step_begin();
         // przetwarza alarmy, czyli funkcje uruchamiane po
            // pewnych ilościach cykli, w tym przypadku ustalanych w alarmach.
         for(int a = 0; a<2; a++)
         {
             if(obj[i]->alarm[a] >= 0)
             {
                 obj[i]->alarm[a]--;
             }
             if(obj[i]->alarm[a] == 0)
             {
                 switch(a)
                 {
                     case 0: obj[i]->alarm0(); obj[i]->alarm[a] = -1; break;
                     case 1: obj[i]->alarm1(); obj[i]->alarm[a] = -1; break;
                     //...
                 }
             }
         }
         // przetwarza step
            obj[i]->step();
     }
}

void draw()
{
     // rysuje objekty mapy
     for(int i = 0; i<obj.size(); i++)
     {
         if(obj[i]->show)
                obj[i]->draw();
     }
}
};

4. dodaje obiekty do mapy

 

class Mapa0 : public MapaParent
{
public:
Mapa0()
{
     // dodaje objekt do vactora
  instance_create(100, 100, new objects0);
  instance_create(200, 100, new objects1);
    }
};

 

5. Uruchamiamy nasz program

 

int main()
{
    Mapa0 * map = new Mapa0();
map->create();
    while(true)
    {
        map->step();
        map->draw();
    }
return 0;
}

Gotowy program z kodem źródłowym:

Plik

 

 

 

Za dużo nie napisałem ale to niebyło moim celem, ale pokazałem jak w prosty sposób zarządzać obiektami w stylu Game Makera.

Odnośnik do komentarza
Udostępnij na innych stronach

Powiem Ci kolego że masz paskudny styl pisania. Zacniej by to wyglądało: deklaracje w ciele klasy, definicje poza nią. tak to kaszanka nieco sie robi czytając to. zaraz sprawdze program.

 

EDIT: 3 warningi zostawiłeś, każde dotyczyło gryzienia się typów signed/unsigned, czyli tych linijek, gdzie trzeba było dopisać unsigned:

for(unsigned int i = 0; i<obj.size(); i++)

a tak poza tym to program działa, więc jest dobrze.

Odnośnik do komentarza
Udostępnij na innych stronach

Gdy alokujesz pamięć za pomocą operatora new należy ją zwalniać używając operatora delete.

Jak dla mnie to ten sposób konserwacji kodu trzeba by nieco usprawnić. Przede wszystkim pisanie kodu C++ "w stylu GM-a" nie jest zbyt dobrym pomysłem.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...