Skocz do zawartości

CrackGM

Użytkownicy
  • Postów

    73
  • Dołączył

  • Ostatnia wizyta

Odpowiedzi opublikowane przez CrackGM

  1. Hmmm, to być może pozostaje mi się przenieść na inne środowisko (tak to się nazywa, prawda?). Visual C++ 2008, będzie dobry i w końcu będę mógł coś zrobić z SFML?
    Środowisko, IDE, jedno i to samo. No ja akurat tego używam i moim zdaniem jest dobry, ale nie żebym później wyszedł na trolla przekonującego do swojego - z C::B też by działało tylko pewnie coś gdzieś nie trybi :D
  2. Em, w życiu czegoś takiego nie doświadczyłem.

    To co wklejasz to build wersji debug, nie wiem jak działa debug w C::B ale spróbuj skompilować normalnie.

    No i druga rzecz to moim zdaniem jak przestawiłeś się z console na GUI Application to nie powinieneś mieć int main(), tylko int WinMain() - winapi, prawdopodobnie będziesz musiał dorzucić jeszcze windowsowe liby, ale szczerze nie wiem, nie ufam ani Devowi > 4.9.9.2 ani C::B.

  3. Em, nie zaznaczyłeś żadnego breakpointa z lewej strony? btw. nie znoszę nowszych wersji Deva od 4.9.9.2, przyrosłem do niego (w szkole), bo w domu jednak wole MSVC++ 2008 express.

    Sprawdź w zakładce Uruchom -> Kompiluj i uruchom. Być może nowsze wersje Deva zwyczajnie mają inne hoty

  4. #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class Object {
    public:
        bool exists;
        virtual void onStep()=0;
        virtual void onRender()=0;
        virtual void onDestroy()=0;
        Object() { exists = true; }
    };
    
    vector<Object*> objects;
    int ids = 0;
    bool gameIsOn = true;
    
    class oPlayer : public Object {
    public:
        oPlayer();
        virtual void onStep();
        virtual void onRender();
        virtual void onDestroy();
        int health;
    };
    
    oPlayer::oPlayer() {
        health = 10;
    }
    
    void oPlayer::onStep() {
        health -= 1;
        if (health <= 0) {
            onDestroy();
        }
    }
    
    void oPlayer::onRender() {
        cout << health << endl;
    }
    
    void oPlayer::onDestroy() {
        gameIsOn = false;
        exists = false;
    }
    
    int findFreeID() {
        for (size_t i = 0; i < objects.size(); i++) {
            if (!objects[i]->exists) return i;
        }
        return -1;
    }
    
    int newObject(Object* obj) {
        int id = findFreeID();
        if(id != -1) {
            objects[id] = obj;
        } else {
            objects.push_back(obj);
            id = objects.size()-1;
        }
        return id;
    }
    
    int main() {
        int playerID = newObject(new oPlayer());
        cout << "Player ID: " << playerID << endl;
    
        while(gameIsOn) {
            for (size_t i = 0; i < objects.size(); i++) {
                if (objects[i]->exists) {
                    objects[i]->onStep();
                }
            }
            for (size_t i = 0; i < objects.size(); i++) {
                if (objects[i]->exists) {
                    objects[i]->onRender();
                }
            }
        }
        cout << "Game End." << endl;
        system("pause");
        return 0;
    }

    V2 + Dodawanie obiektów w locie :3

  5. Ponieważ wiele osób ma problemy z organizacją kodu w grach pisanych poza GM i często stosują artystyczny nieład w którym później sami nie mogą się połapać postanowiłem napisać krótki tutorial który może pomóc.

    Zapewne wielu bardziej doświadczonych koderów gier ode mnie wyśmieje ten sposób - z góry mówię nie jest to najlepszy sposób - ma on na celu pomóc przemyśleć organizację w kodzie.

     

    A więc gwoździem programu są klasy i dziedziczenie które musicie opanować. (http://pl.wikibooks.org/wiki/C%2B%2B/Czym_jest_obiekt oraz http://pl.wikibooks.org/wiki/C%2B%2B/Dziedziczenie), sam mistrzem nie jestem, często zaglądam do pomocy online ale podstawy trzeba znać.

     

    Nie będę tutaj się rozpisywał, lepiej przejdę do konkretów.

     

    Najpierw musimy sobie zrobić "szkielet" naszych przyszłych gjeemowych obiektów:

    class Object {
    public:
        int myID;
        bool exists;
        virtual void onCreate()=0;
        virtual void onStep()=0;
        virtual void onRender()=0;
        virtual void onDestroy()=0;
    };

    Jak każdy GMowy obiekt mamy eventy, dlatego jest to umieszczone w szkielecie (każdy obiekt ma eventy - tutaj pokazałem przykładowe).

    Zwróćcie uwagę na to że metody wewnątrz szkieletu są abstrakcyjne, jest to ważne. Zmienna booleanowa exists jest pierdołą która może się przydać później, oczywiście pokażę to niżej. Warto również zapisać sobie ID obiektu, które zapodamy później w naszym vectorze, który będzie nam przechowywał stworzone już obiekty, który definiujemy w ten sposób:

    vector<Object*> objects;

    Vector nie przechowuje klas abstrakcyjnych...ale może przechowywać wskaźniki na nie.

     

    To teraz możemy dodać trochę kolejnych pierdół do naszego kodu typu:

    int ids = 0;
    bool gameIsOn = true;

    Zalecam zadeklarować to jako zmienne globalne.

     

    Teraz definicja naszego obiektu:

    class oPlayer : public Object {
    public:
        virtual void onCreate();
        virtual void onStep();
        virtual void onRender();
        virtual void onDestroy();
    
        int health; // nasze zmienne
    };
    
    void oPlayer::onCreate() {
        health = 10;
    }
    
    void oPlayer::onStep() {
        health -= 1;
        if (health <= 0) {
            onDestroy();
        }
    }
    
    void oPlayer::onRender() {
        cout << health << endl;
    }
    
    void oPlayer::onDestroy() {
        gameIsOn = false;
        exists = false;
    }

    Jeżeli rozumiecie klasy i dziedziczenie to nie ma co tutaj się rozpisywać... raczej wszystko jest jasne :)

     

    Teraz najważniejsza część kodu - pętla główna gry itp:

     

    int main() {
        int playerID = ids; // jak przechowywać ID playera
        objects.push_back(new oPlayer()); //dodajemy nowy obiekt do vectora
        ids ++; //i zapisujemy sobie ile to już mamy obiektów.
    
            //obsługa eventów - onCreate - wykonywane tylko raz. Oczywiście onCreate można zastąpić sobie zwykłym konstruktorem (w sumie jest niepotrzebne, lepiej użyć konstruktor - wtedy jest łatwiej jeżeli tworzymy obiekty w toku gry)
        for (int i = 0; i < ids; i++) {
            objects[i]->myID = i; // zapisujemy sobie id obiektu z vectora 
            objects[i]->onCreate();
        }
    
            //pętla głowna gry - tutaj wszystko się "dzieje"
        while(gameIsOn) {
                    //znów obsługa eventów...onStep
            for (int i = 0; i < ids; i++) {
                if (objects[i]->exists) {
                    objects[i]->onStep();
                }
            }
                    //...i onRender
            for (int i = 0; i < ids; i++) {
                if (objects[i]->exists) {
                    objects[i]->onRender();
                }
            }
        }
        cout << "Game End." << endl;
        system("pause");
        return 0;
    }

    Mam nadzieję że wszystko jest w miarę jasne.

    Znów podkreślam że tutorial nie jest "sztywnym" szkieletem dla twórców gier - to jest tylko najprostszy przykład organizacji obiektów/kodu, dla początkujących koderów gier. Sam na tym działam...no i działa :D

     

    Cały kod:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class Object {
    public:
        int myID;
        bool exists;
        virtual void onCreate()=0;
        virtual void onStep()=0;
        virtual void onRender()=0;
        virtual void onDestroy()=0;
    };
    
    vector<Object*> objects;
    int ids = 0;
    bool gameIsOn = true;
    
    class oPlayer : public Object {
    public:
        virtual void onCreate();
        virtual void onStep();
        virtual void onRender();
        virtual void onDestroy();
        int health;
    };
    
    void oPlayer::onCreate() {
        health = 10;
    }
    
    void oPlayer::onStep() {
        health -= 1;
        if (health <= 0) {
            onDestroy();
        }
    }
    
    void oPlayer::onRender() {
        cout << health << endl;
    }
    
    void oPlayer::onDestroy() {
        gameIsOn = false;
        exists = false;
    }
    
    
    int main() {
        int playerID = ids;
        objects.push_back(new oPlayer());
        ids ++;
    
        for (int i = 0; i < ids; i++) {
            objects[i]->myID = i;
            objects[i]->onCreate();
        }
    
        while(gameIsOn) {
            for (int i = 0; i < ids; i++) {
                if (objects[i]->exists) {
                    objects[i]->onStep();
                }
            }
            for (int i = 0; i < ids; i++) {
                if (objects[i]->exists) {
                    objects[i]->onRender();
                }
            }
        }
        cout << "Game End." << endl;
        system("pause");
        return 0;
    }

     

    (polecam również każdy obiekt zapodać sobie w oddzielnym headerze (dla mało wiedzących *.h))

     

    I tak nikt nie doceni, ale przynajmniej jest. xD

  6. 29p54k1.jpg

    gdyby nie twarz to na kartce w kratkę ołówkiem by było git, ale jak już bawisz się w tablet czy coś w tym rodzaju to włóż w pracę więcej czasu*, po prostu nie śpiesz się, daj sobie czas na poprawki.

    * - to nie jest hejt.

     

    E: +nieproporcjonalny bark :D

  7. mam na dysku jeszcze steamworksa, portowanie steama pod gma to pół godziny

    inną sprawą jest to że jak na steamie zaczną się pojawiać catch the clowny to będzie lipa. Moim zdaniem sprawdzanie poziomu gry jest ważne :)

  8. Pierwszy raz spędziłem nad texturą więcej czasu niż godzinę, oto efekty. Nie miałem pędzla typu rozjaśnianie ściemnianie i smużenie bo robiłem to w paint.net :/ ale jakoś dałem radę. Na modelu niestety z bliska nie wygląda to dobrze bo textura jest w małej rozdzielczości.

    Edit: Almost done

    SturmgeschutzSkin2.png

    czemu to takie ładne? :) pokaż jak wygląda czołg ;>

  9. Dobra, już wiem co jest nie tak z drzewami. Są za proste, a to dla tego, że gdy zaczynałem projekt sugerowałem się lasem z Gnijącej Panny Młodej:

    corpse2.jpg, ale mojej gierce do takiego efektu jeszcze długa droga. Póki co po prostu powyginałem trochę sosny. Co sądzicie o nich teraz?

    ab7wzv.png

    <33333333333333333333333333333333333333333333333

     

    kocham

×
×
  • Dodaj nową pozycję...