Skocz do zawartości

CrackGM

Użytkownicy
  • Postów

    73
  • Dołączył

  • Ostatnia wizyta

O CrackGM

  • Urodziny 18.03.1996

O mnie

Osiągnięcia CrackGM

Smart Newbie

Smart Newbie (2/13)

0

Reputacja

  1. CrackGM

    Kurs C++

    już umiesz, ok to sorry
  2. CrackGM

    politechnika poznanska

    czesc kto leci na informatyke WE na politechnike poznanska? z ciekawosci
  3. jeżeli nie masz czipa a chcesz sprawdzić kod to szukaj proteus isis w googlach a druga sprawa to z tego co widzę to na 25 stronie masz memory map szkoda że rzadko tu wchodzę
  4. Ś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
  5. 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.
  6. To zwyczajnie poszukaj w zakładach u góry czegoś w rodzaju kompiluj/kompiluj & uruchom.... Bo poprawnie się kompiluje, a kod z tutka musi działać(bo działa)...
  7. 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
  8. Weź nie debuguj, tylko machnij F9
  9. He, wiesz, nie napisalem ze to jest najlepszy sposób tylko pomoc/drogowskaz dla tych którzy nie mają o tym zielonego pojęcia :D
  10. #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
  11. Do dodawania instancji w locie wystarczylo zamienic onCreate na zwykly konstruktor i dopisac funkcje w stylu findfreeid (banalne)
  12. 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
  13. CrackGM

    Galeria Grafik

    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
  14. tak, kąt padania = kąt odbicia, ale trzeba jeszcze poprowadzić prostopadłą do paletki "normalną" takie rzeczy były w gimnazjum
×
×
  • Dodaj nową pozycję...