baca Opublikowano 5 Stycznia 2010 Udostępnij Opublikowano 5 Stycznia 2010 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 Więcej opcji udostępniania...
CTRL Opublikowano 7 Stycznia 2010 Udostępnij Opublikowano 7 Stycznia 2010 yyyy czemu link tzn program nie działa :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
PsichiX Opublikowano 7 Stycznia 2010 Udostępnij Opublikowano 7 Stycznia 2010 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 Więcej opcji udostępniania...
Snake Opublikowano 7 Stycznia 2010 Udostępnij Opublikowano 7 Stycznia 2010 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 Więcej opcji udostępniania...
baca Opublikowano 8 Stycznia 2010 Autor Udostępnij Opublikowano 8 Stycznia 2010 Wiem że to nie jest szybki sposób na zarządzania obiektami bo mi na tym nie zależało, tylko na prostocie i jest to dobry przykład dla osób przechodzących z gm na c++, a co do bugu int/u_int czyszczenia pamięci to nie zauważyłem. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę