Projekt gry

0

Tworzę platformówkę i mam kilka pytań odnośnie elementów, które tam będą się znajdowały.

1.Czy gracz i przeciwnicy powinni mieć jedną klasę nadrzędną Entity. Czytałem że nie powinno się tak robić, ale te jednostki mają dużo wspólnego.

2.Czy kontener MAP będzie dobrym kontenerem na jednostki, jeżeli te będą często z kontenera usuwane, i aktualizowane co każdy obrót pętli.

3.Czy jeżeli tworzy się przedmioty,jednostki,bloki, to lepiej
a)W pliku tekstowym mapy ustawiać wartości danego bloku, przeciwnika, przedmiotu: np. blok [Static, x,y, collision 1, 10, 20]
b)Stworzyć pliki Items,Tiles,Entities, i tam tworzyć [Snake, HP:10, Mana: 0, MoveSpeed: 40]. A potem na mapie rozkładać [Snake, x,y]?

Pierwsza opcja pozwala na elastyczne zmiany, np. nie trzeba robić dwóch osobnych potworów typu Snake, jeśli różnią się tylko kilkoma punktami HP, ale ta druga jest bardziej przejrzysta.

4.W jaki sposób rozpisać projekt żeby wszystkie klasy ze sobą współgrały, i potem nie było problemów z dostępem do czegoś?

3
  1. Zalezy, ale na pewno powinny miec podobne interfejsy (klasy abstrakcyjne). Np atak. Gracz i przeciwnik beda miec rozne ataki ale jednak beda oboje atakowac (np inna animacja). Musisz podac wiecej szczegolow zeby sie na ten temat wypowiedziec

  2. pewnie ze tak. map jest zbudowana na wezlach (inaczej sie to nazywa tablica asocjacyjna) wiec z usuwaniem/szukaniem/wybieraniem obiektu nie bedzie problemu

  3. w pierwszym rozwiazaniu pogubisz sie bardzo szybko. Zobacz sobie jak robia edytory map. Bron boze recznie nie modyfikuj pliku. Niech kod za Ciebie to robi!

  4. Nie rozpisuj bardzo dokladnie projektu na klasy i jakie funkcje beda miec. To sie nazywa Waterfall i nigdy nie dziala. Opisz sobie w dokumencie co sie bedzie dziac, co bedziesz potrzebowac i rozrysuj sobie +- zaleznosci i koduj... wiekszosc wyjdzie w praniu. Czasami bedzie tak ze to co napisales 3 dni temu bedzie do wyrzucenia bo wpadles na lepszy pomysl. Taki juz proces kodzenia.

a odnosnie wygody. Powinienes pisac w jezyku skryptowym. Zainteresuj sie LUA jest uzywany do gier (szczegolnie z c++)
W c++ napisz sobie silnik (redenderowanie, obluga zdarzen etc) a logike gry koduj w jezyku skryptowym. Nie bedziesz musial za kazdym razem kompilowac zmian, wystarczy ze zapiszesz nowy skrypt walniesz powiedzmy f6 w projekcie (bedziesz miec wychwytywanie zdarzen pod tym przyciskiem) i przeladuje sie plik skryptowy. I JUZ WIDZISZ ZMIANY

0
  1. Czy gracz i przeciwnicy powinni mieć jedną klasę nadrzędną Entity

To jest podrzędna sprawa. Bardziej ważne jest, żeby

  • nie powtarzać kodu
    (klasa nadrzędna Entity faktycznie pozwoli na wsadzenie wspólnego wielu jednostkom kodu, np. kodu renderowania, do jednej klasy)

  • żeby różne obiekty zachowywały się różnie, np. żeby żołnierz strzelał z karabinu, a pies gryzł, a nie odwrotnie.
    (i tutaj faktycznie, jak wyprowadzisz z klasy Entity podklasy typu Player czy Enemy, to będziesz mógł w każdej podklasie zdefiniować metody np. onCollision, 'attack', czy move, które pozwolą przypisać różne zachowania do różnych jednostek wg ich typu.

Więc faktycznie - to co piszesz, to jedno z rozwiązań. Problem tylko, że nie jedno. Można choćby zrezygnować z dziedziczenia w ogóle i działać na kompozycji i wtedy składać zachowania - np. żołnierz by mógł mieć w sobie komponent Shooting odpowiedzialny za strzelanie, pies by mógł mieć komponent Biting odpowiedzialny za gryzienie etc.

No i można jeszcze inaczej sobie to rozplanować. Do woli.

Czytałem że nie powinno się tak robić,

To sprawdź w praktyce. Na początku możesz zrobić tak, jak będzie ci łatwiej zrobić, ale jednocześnie żeby zachować w miarę elegancki kod oraz, żeby gra była łatwo modyfikowalna. Pewnie na początku ci się nie uda tego zrobić. I dobrze. Jeśli za 5 czy 10 razem coś ci się nie uda, to potem wyrobisz własne zdanie na temat pewnych rozwiązań, zamiast tylko kopiować rozwiązania (chociaż nie należy też wymyślać koła na nowo - bo na większość problemów w robieniu gier ktoś kiedyś już znalazł receptę).

Tak więc - jeśli wyczytałeś gdzieś jak można to rozwiązać - nic nie stoi na przeszkodzie, żebyś wypróbował wyczytane rozwiązania próbując zrobić prostą grę wg wyczytanego sposobu i zobaczysz wtedy zarówno zalety jak i wady pewnych rozwiązań (bo wszystko ma zalety i wady).

0

Jeszcze mam pytanie dotyczącą operacji na wskaźnikach. Przykładowo robię kontener std::map <Item*> item; w klasie Map (mapa z poziomem). Wypełniam go przedmiotami, i potem gdy zajdzie kolizja z graczem, to wysyłam przedmiot do klasy gracza player.addItem(Item *item);, tam przypisuję do nowego kontenera w klasie gracz, gdzie przetrzymywane są jego przedmioty, a kontener z klasy Map pomniejszam. Czy jest to dobre rozwiązanie na operowanie przedmiotami w grze, czy polecacie inne rozwiązania?

0

uzywaj smart pointerow. nigdy nie uzywaj golych wskaznikow

std::shared_ptr
http://www.cplusplus.com/reference/memory/shared_ptr/
std::unique_ptr
http://www.cplusplus.com/reference/memory/unique_ptr/

0

Czyli rozumiem że wystarczy to zamienić na std::unique_ptr, i takie rozwiązanie będzie w porządku?

1 użytkowników online, w tym zalogowanych: 0, gości: 1