Problem z nauką klas i obiektów
Ostatnio zmodyfikowano 2012-12-23 21:32
KrzysiekB Temat założony przez niniejszego użytkownika |
Problem z nauką klas i obiektów » 2012-12-23 19:24:17 Witam! Jako że jestem nowy na forum to wypadałoby pozdrowić wszystkich ze strony :) Od jakiegoś czasu pracuje sobie z biblioteką SFML 1.6 (pare miesięcy) dziś nawet zaliczyłem przesiadkę na wersję 2.0 i próbowałem sobie robić w tej bibliotece różne rzeczy i zacząłem sobie tworzyć własną grę. Projekt szedł sprawnie i ładnie było parę problem co prawda ale znalazłem parę przydatnych linków i "jakoś szło". Poprzednio nieprogramowałem obiektowo a nawet mało co funkcji robiłem. Schody zaczeły się gdy kod stawał się coraz bardziej nieczytelny i trudny do zrozumienia. Wczytując się więc w rady innych na forach doszłem do wniosku że należałoby się nauczyć tej "obiektowości". No więc proste klasy opanowałem ale niemogę dojść do tego jak zrobić klasy dla mojej gry. Napisałem klasę Kafelek która na razie ma tylko trzymać informację na temat każdego kafla ale niedziała. W końcu po szukaniu w bezkresnym morzu internetowych informacji zdecydowałem się zarejestrować tutaj i opisać problem. Poniżej wklejam kod programu: main.cpp #include <SFML/Graphics.hpp> #include "kafelek.hpp"
int main( int argc, char * argv[] ) { if( argc > 1 ) return 1; std::string EXE_PLIK; EXE_PLIK = argv[ 0 ]; std::string EXE_FOLDER; EXE_FOLDER = EXE_PLIK; EXE_FOLDER.erase( EXE_FOLDER.size() - 17 ); std::string DATA_1 =( EXE_FOLDER + "dirt.png" ); sf::Texture * Textura; Textura->loadFromFile( DATA_1 ); sf::RenderWindow window( sf::VideoMode( 800, 600 ), "Test" ); Kafelek MapaKafli[ 3 ][ 3 ]; for( short int x = 0; x < 3; x++ ) { for( short int y = 0; y < 3; y++ ) { MapaKafli[ x ][ y ].KafelekUstaw( Textura, x << 4, y << 4 ); } } while( window.isOpen() ) { sf::Event event; while( window.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) window.close(); } window.clear(); window.display(); } return 0; }
kafelek.hpp #pragma once #include <SFML/Graphics.hpp>
class Kafelek : public sf::Sprite { public: Kafelek() { Sprite Kafel; } ~Kafelek() { } void KafelekUstaw( sf::Texture * img, float X, float Y ) { IMG = img; setTexture( * IMG ); setPosition( X, Y ); } private: sf::Texture * IMG; };
Czy ktoś byłby mi w stanie wytłumaczyć jakie tworzyć klasy w grze opartej na kaflach i jak tworzy się taką przykładową klasę? Z góry dziękuje i zapraszam do komentowania nawet negatywnego. |
|
KrzysiekB Temat założony przez niniejszego użytkownika |
» 2012-12-23 20:21:28 Udało mi się rozwiązać ten problem. Wystarczyło zamiast tworzyć wskaźnik na zmienną sf::Texture zrobić zmienną sf::Texture takie moje głupie przeoczenie :) Dodatkowo zrobiłem wyświetlanie tej mapy kafli. [/code] w main.cpp pomiędzy czyszczeniem a wyświetlaniem dodatkowo: window.clear(); for( short int x = 0; x < 3; x++ ) { for( short int y = 0; y < 3; y++ ) { window.draw( MapaKafli[ x ][ y ] ); } } window.display();
|
|
Mrovqa |
» 2012-12-23 20:21:52 sf::Texture * Textura; Textura->loadFromFile( DATA_1 ); Wskaźnik Textura nie wskazuje na żaden obiekt - odwołujesz się do nieswojej pamięci. Ponadto: Kafelek() { Sprite Kafel; } O co tu chodzi? Tworzysz tymczasowy obiekt, z którego nawet nie korzystasz - ten kod nic nie zmienia w Twojej grze. /edit: widzę, iż autor poradził sobie przed wysłaniem mojego postu. Gratuluję ;) |
|
DejaVu |
» 2012-12-23 20:22:31 Próbuję zebrać myśli :P Jak je odpowiednio poskładam do kupy to jakąś poradę konkretną Ci napiszę, która powinna być dla Ciebie wygodna w użyciu :)
/edit: ... ale skoro problem rozwiązany to nie będzie wywodu ;p |
|
KrzysiekB Temat założony przez niniejszego użytkownika |
» 2012-12-23 20:29:52 @UP Dziękuje za pomoc choć trochę późną :D A gdybym teraz chciał dorobić klasę chunków do tego programu to jak by ona mogła wyglądać? Chodzi mi o to że konkretna mapa składała by się z klasy mapy=>klasy chunka=>klasy kafla Klasa chunka przyjmuje dane z zewnątrz(z klasy mapy ale na czas testów sztywne dane) i zapisuje je do pola obiektu i na podstawie tych pól wyświetla takiego chunka czy dobrze myślę czy można prościej?
Edit:/ Czy da się zrobić tak aby klasa kafelek dziedziczyła jednocześnie z klasy sprite i chunk? |
|
DejaVu |
» 2012-12-23 21:00:31 @up: da się. Jednak na Twoim miejscu unikałbym stosowania jakichkolwiek dziedziczeń, dopóki nie nauczysz się prawidłowo tworzyć i pracować z prostymi klasami. |
|
KrzysiekB Temat założony przez niniejszego użytkownika |
» 2012-12-23 21:15:41 Więc jakie jeszcze klasy mogą zawierać gry bo szczerze to niemam pojęcia? Probuję napisać grę w której mapa generuję sie do pliku a następnie do pamięci ładowana jest jej część (CHUNK) dany chunk przechowuje dane kafli w nim zawartych i ogólnie całego wycinka jego mapy np. obejmuje 300x300 kafli system chunków chcę wprowadzić po to że gra pobierała by zbyt wiele pamięci bo gdybym niemiał takiego systemu to nawet tablica dwuwymiarowa typu np.short int[3000][3000] zajmowałaby sporo pamięci a przecierz mapa ta to nie tylko kafle na pierwszej warstwie ale o wiele więcej więc nawet pare GB pamięci było by zajęte dochodząc do granicy chunka ładowałby się następny a poprzedni usunął by się po przekroczeniu odpowiedniej odległości
A tak to z danego chunka wybieram sobie obszar rysowania czyli okno + trochę (aby zlikwidować efekt doczytywania) czyli po +-3 kafle więcej w każdą stronę ekranu
Ponadto zauważyłem że SFML 2 pommimo lepszych opini na temat wydajności niejest jakimś demonem prędkości bo na SFML 1.6 miałem lepszą wydajność przy podobnym progamie
Zapisywanie i wczytywanie oraz obszar renderu zrobiłem już kiedyś tylko problem jest z tymi chunkami aby dynamicznie doładowywać obszar mapy
Edit:/ Poza tym chunki mają jeszcze jedną ogromną zaletę oprócz oszczędności pamięci a mianowicie pozwalają na stworzenie nieskończonej mapy |
|
DejaVu |
» 2012-12-23 21:29:41 Nie ma sensu rozważać tak zaawansowanych mechanizmów, skoro nie znasz dobrze języka C++. Po prostu najpierw zakopiesz się w takim projekcie, a potem go porzucisz. |
|
« 1 » 2 |