Autor Wątek: Logika silnika, plan  (Przeczytany 4537 razy)

Offline walkinguer

  • Użytkownik

# Lipiec 23, 2013, 22:53:10
Witajcie!

Pochodzę z PHP, ogólnie aplikacji internetowych. Czas na grę. Właśnie pobieram środowisko, nigdy nie miałem dobrych stosunków z C++, ale czas najwyższy się z nim zaprzyjaźnić. Jea. Z góry przeproszę za angielskie wyrażenia jeśli takie się pojawią.


Cała gra jest zaplanowana, większość funkcji, wszystko jest w głowie, czeka na przełożenie na kod. Potrzebuję pomocy z zaplanowaniem pliku w rodzaju "main.php", czyli w jaki sposób uruchomię grę. Plan jest taki:

1. Buduję grę w wersji tekstowej (konsolowej, interfejs na bazie wpisz współrzędne, lub identyfikator opcji).
2. Po ukończeniu zabieram się za najtrudniejszą rzecz, świat 3d, audio itp.

Funkcje gry:

-. Baza danych (chciałbym tam umieszczać wszystko na temat gry, użytkownika, jak w php)
-. Ustawienia gry i save'y w plikach

1. Main menu (+ profil użytkownika)

2. Wybór mapy
- Wyświetlenie dostępnych map, załadowanie save'a

3. Załadowanie mapy, interfejsu
- Mapa, heightmap
- Budowa obiektów


Okej, to było mega streszczenie. Moje pytanie brzmi, jak powinien wyglądać plik główny, abym mógł oprzeć całą grę na plikach, obiektach, klasach i mógł w miarę sprawnie dodać świat 3d?

W PHP podzieliłbym to na 3 pliki główne. mainmenu.php, mapselect.php, playmap.php
Reszta plików byłaby klasami np. AddBuilding.


Niestety gry są bardziej skomplikowane i nie wiem jak to rozwiązać. Chciałbym programować grę w sposób jak najbardziej zbliżony do PHP, jednak nie wiem w co ubrać te 3 pliki główne. "CO" wykorzystać, aby móc przejść z etapu Menu główne do etapu Wybór mapy, a następnie do świata 3d Załadowanie mapy jednocześnie zamykając każdy poprzedni.

Mógłby ktoś mi pomóc? Naprowadzić mnie, lub wymyślić to za mnie? To cholernie głupi problem, kminię nad tym od wczoraj i nie ogarniam, to po prostu wykracza poza moje kompetencje i wiedzę płynącą z artykułów jakie czytam.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Moderator

  • +3
# Lipiec 23, 2013, 23:06:02
Czas na grę. (...) C++
Nie widzę związku między jednym a drugim.

1. Buduję grę w wersji tekstowej (konsolowej, interfejs na bazie wpisz współrzędne, lub identyfikator opcji).
2. Po ukończeniu zabieram się za najtrudniejszą rzecz, świat 3d, audio itp.
Gry konsolowe i 3D to całkowicie inne twory. Zupełnie niepodobne środowisko, a więc przełożenie gameplayu 1:1 jest całkowicie niemożliwe. Lepiej byś zrobił dwa osobne projekty, pierwszy tekstowy, drugi normalny.



Ogólnie zabierasz się do tego od dupy strony. Gry najpierw się wymyśla, potem robi. Musisz mieć wizję tego, co robisz, zanim w ogóle siądziesz do kodu. I przede wszystkim: nie ma generycznego modelu kodu dla wszystkich rodzajów gier.

Offline Bielos

  • Użytkownik

  • +1
# Lipiec 24, 2013, 00:10:02
Funkcje gry:

-. Baza danych (chciałbym tam umieszczać wszystko na temat gry, użytkownika, jak w php)
-. Ustawienia gry i save'y w plikach

1. Main menu (+ profil użytkownika)

2. Wybór mapy
- Wyświetlenie dostępnych map, załadowanie save'a


Za dużo myślisz technologiami WEB. Fuuu :D Widać to po pomyśle z bazą danych. Po co robić zapytania, bawić się w jakąś bazę, skoro wszystko możesz trzymać w pliku, save, nawet TXT zwykłym. Nikt Cię niczym nie ogranicza. Chyba w tym przypadku baza danych to jest najgorsze co można zrobić.

3 pliki i gra 3D? łololo. No tak, w webowych 3 pliki wystarczą na wszystko. No ale to ma być gra a nie strona internetowa. Właściwie zacznijmy od tego co wiesz na temat programowania poza PHP ? :D

To są dwie różne dziedziny, inne podejście do programowania aplikacji. W webowych wystarczy layout, connect z bazą i wszyscy szczęśliwi :D

Ok, to przykładowo, weźmy silnik Irrlicht: 182 osobnych plików klas.
Ogre ma jakieś 250 (no tak mniej więcej podaje).

Nawet prosta gra 2D troszkę tego powinna mieć (wczytywanie save, postać, wyświetlanie grafiki, przetwarzanie I/O, logika)

Zabierasz się za pisanie w C++ więc masz pełne pole do popisu. Jak narysujesz grafikę (czy DX, opengl, czy jakiś framework typu ogre) i jak będziesz pobierał komunikaty od usera (np z klawiatury) zależy tylko od Ciebie. Wybierasz co Ci pasuje w danym momencie. Sposób zapisu danych też jest dowolny (własny format, txt i coś tam jeszcze). Co do rozplanowania to robisz tyle klas i plików ile będzie dla Ciebie czytelne. Na pewno upakowanie wszystkiego do jednego pliku (szczególnie że zwykle robi się jedna klasa = jeden plik) nie jest dobrym pomysłem. Chodzi o to żebyś się później mógł w tym odnaleźć :D
« Ostatnia zmiana: Lipiec 24, 2013, 00:24:45 wysłana przez Bielos »

Offline Xirdus

  • Moderator

  • +2
# Lipiec 24, 2013, 00:22:02
Za dużo myślisz technologiami WEB. Fuuu :D Widać to po pomyśle z bazą danych. Po co robić zapytania, bawić się w jakąś bazę, skoro wszystko możesz trzymać w pliku, save, nawet TXT zwykłym. Nikt Cię niczym nie ogranicza. Chyba w tym przypadku baza danych to jest najgorsze co można zrobić.
Baza danych nie znaczy SQL. Głupi config w txt też jest bazą danych.

3 pliki i gra 3D? łololo. No tak, w webowych 3 pliki wystarczą na wszystko. No ale to ma być gra a nie strona internetowa. Właściwie zacznijmy od tego co wiesz na temat programowania poza PHP
Oj weź przestań. Widzisz że gość się nie zna ale próbuje. Może zachęcajmy go zamiast zniechęcać? BTW, czemu wyedytowałeś część o PHP zanim zdążyłem ją skomentować?

To są dwie różne dziedziny, inne podejście do programowania aplikacji. W webowych wystarczy layout, connect z bazą i wszyscy szczęśliwi :D

Ok, to przykładowo, weźmy silnik Irrlicht: 182 osobnych plików klas.
Ogre ma jakieś 250 (no tak mniej więcej podaje).

Nawet prosta gra 2D troszkę tego powinna mieć (wczytywanie save, postać, wyświetlanie grafiki, przetwarzanie I/O, logika)
Chyba nie myślisz serio, że korporacyjne molochy pracują na jednym i tylko jednym pliku ze skryptem PHP?

Offline Bielos

  • Użytkownik

# Lipiec 24, 2013, 00:30:30
Oj no żartowałem z tym PHP :D
Pewnie, że nie pracują na jednym skrypcie.

Myślę, że jednak kolega miał na myśli SQL (no chyba, że się mylę).

Na pewno tak jak wspomniał Xirdus musisz się zastanowić co tak naprawdę chcesz pisać. Skoro miałeś raczej mało doczynienia z C++ może na początek wystarczy coś konsolowego(nikt nie powiedział że nie da się zrobić tam czegoś fajnego ;-) ) lub prosta gierka 2D w jakimś frameworku (tu nie będę nic polecał bo się nie znam). No i myślę, że jak chcesz się zaprzyjaźnić z C/C++ i ogólnie aplikacjami nie Webowymi to warto zmienić podejście. Pisanie czegoś "tak jak w php" nie jest dobrym pomysłem.

Co do organizacji kodu to tak jak wspomniałem to od Ciebie zależy, jak będzie dla Ciebie czytelniej. Na pewno upychanie wszystkiego do jednego pliku/klasy nie jest dobrym pomysłem.

Cytuj
BTW, czemu wyedytowałeś część o PHP zanim zdążyłem ją skomentować?
Stwierdziłem jednak, że to co napisałem jest baaardzo złe i wywaliłem :D
« Ostatnia zmiana: Lipiec 24, 2013, 00:36:32 wysłana przez Bielos »

Offline Xion

  • Redaktor
    • xion.log

  • +1
# Lipiec 24, 2013, 00:36:21
Pierwszy post Bielosa radziłbym zupełnie zignorować. Pokazuje, że autor w ogóle nie ma pojęcia co dzisiaj znaczy tzw. "webowe programowanie", co widać zwłaszcza w tym stwierdzeniu:
Cytuj
W webowych wystarczy layout, connect z bazą i wszyscy szczęśliwi :D

Co do pytania OP, to odpowiedź jest prosta: tak się nie da. Nie da się napisać gry tekstowej a potem zrobić z niej "3D", bo to zupełnie inna mechanika.
I właśnie mechanika to jest to co powinieneś ustalić najpierw. Co tak naprawdę chcesz napisać: strategię, platformówkę, shootera? Cokolwiek to będziesz, na pewno zaczniesz od pliku main.cpp (jeśli koniecznie to ma być C++, oczywiście), a potem kolejne będziesz wydzielał w miarę pisania. Nigdy nie możesz zakładać struktury na sztywno. (W "webowych" aplikacjach zresztą też, więc nie bardzo rozumiem o czym mówisz wspominających o tych '3 plikach PHP'...)

Takie rzeczy jak sposób przechowywania configu są niemal trzeciorzędne. Dopóki nie masz innych powodów, wybierz coś co jest najprostsze w użyciu. To może być jakaś biblioteka do JSONa, może być nawet SQLite ("prosty plik TXT" zazwyczaj wcale nie jest 'prosty' bo tak czy siak wymaga jakiegoś parsera, więc można równie dobrze użyć gotowego).

Offline Xirdus

  • Moderator

  • +1
# Lipiec 24, 2013, 00:37:48
Skoro miałeś raczej mało doczynienia z C++ może na początek wystarczy coś konsolowego(nikt nie powiedział że nie da się zrobić tam czegoś fajnego ;-) ) lub prosta gierka 2D w jakimś frameworku (tu nie będę nic polecał bo się nie znam).
NIE, NIE, NIE I JESZCZE RAZ NIE!!!

Najpierw się wpada na pomysł. Potem się zastanawia, jak go zrealizować. Jeśli zaczynasz od myślenia "chcę zrobić jakąś grę", nic z tego nie będzie. Najważniejsza jest idea. Bez idei nie ma tworzenia (bo programowanie jest procesem twórczym).

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +3
# Lipiec 24, 2013, 00:39:59
Cytuj
3 pliki i gra 3D? łololo.
No racja. W webowych może i potrzeba trzech plików, ale w nie-webowych wystarczy dobry framework/silnik i jeden plik. :)

Offline walkinguer

  • Użytkownik

# Lipiec 24, 2013, 00:42:14
Cytuj
I przede wszystkim: nie ma generycznego modelu kodu dla wszystkich rodzajów gier.
Właśnie dlatego jestem na tym forum..

Doskonale wiem jaką chcę zrobić grę i jak wszystko ma działać.. Oprócz startu, czyli "systemu" (przecież tego właśnie chcę się nauczyć, gdyby to była moja 10 gra z kolei to pewnie nie pisałbym tego postu). Technika wykonania danych opcji, funkcji, to już inna kwestia. Trzeba to tworzyć, żeby wiedzieć jak stworzyć. Wydaje się bez sensu ale taka jest prawda, przynajmniej dla początkujących.


Dowiedziałem się już jednej rzeczy, za co ci dziękuje. Nie da sie po prostu przełożyć gry tekstowej na 3d, to oszczędzi mi rozkminy na ten temat.



Tymczasem zupełnie przypadkiem zrozumiałem jak rozwiązać kwestię "podstawki" :).. Tutaj konkretnie chodziło mi o główną pętlę gry. Ale wszystko już jest jasne.

PS. Hej! Albo traktujcie moje wypowiedzi w 100% dosłownie albo przeciwnie :) Napisałem 3 pliki główne, co oznacza, że będą one zawierały np. wspomnianą główną pętlę gry. Wszystkie klasy, funkcje, muszą być rozbite na osobne pliki (o tym też wspomniałem) :) Nikt nie chce przeglądać 100 000 linijek kodu w 1 pliku, czyż nie?


Przejdźmy do kolejnego problemu który się pojawił przy okazji jednej z odpowiedzi:

Config, Save - wspomniałem o tych funkcjach i oczywiste, że będą zapisywane do plików, najlepiej szyfrowanych, (tam gdzie powinny być)

Jeśli mam 250 budynków. Każdy ma własne statystyki, dajmy na to 10 wartości, np. Wysokość, Głębokość itd, które będą się zmieniać w trakcie gry (2500). Do tego statystyki gracza, powiedzmy 100 wartości, ustawień.

Czy komputer to udźwignie, czy muszę myśleć o np. tymczasowym pliku do którego dane byłyby zapisywane co sekundę, a po kliknięciu przycisku "save" do pliku save'a? To chyba ostatni mój problem.


Co do pomysłu z bazą danych. Nie, to miałaby być autorska baza danych, z funkcjami wzorowanymi na SQL, np. Update(building,id,setting,value);

Po prostu mam wrażenie, że to na dłuższą metę byłoby wiele wygodniejsze niż operowanie na zwykłych zmiennych. Pytanie tylko gdzie tą bazę zapisywać i czy w ogóle trzeba ją zapisywać..
« Ostatnia zmiana: Lipiec 24, 2013, 00:44:31 wysłana przez walkinguer »

Offline Xirdus

  • Moderator

  • +1
# Lipiec 24, 2013, 00:55:17
Doskonale wiem jaką chcę zrobić grę i jak wszystko ma działać..
Tak więc krzyż na drogę i do roboty!

Aby się przestawić na myślenie C++owe
Kiedy będziesz potrzebował sprawdzić coś nt. biblioteki standardowej
Gdy trafisz na przeszkodę nie do pokonania przy twoim stanie wiedzy

Config, Save - wspomniałem o tych funkcjach i oczywiste, że będą zapisywane do plików, najlepiej szyfrowanych, (tam gdzie powinny być)
O ile nie robisz flashówki, szyfrowanie save'ów jest bez sensu. No bo przed kim je chronisz? Przed samym graczem?

Jeśli mam 250 budynków. Każdy ma własne statystyki, dajmy na to 10 wartości, np. Wysokość, Głębokość itd, które będą się zmieniać w trakcie gry (2500). Do tego statystyki gracza, powiedzmy 100 wartości, ustawień.
2500 to jest nic. Współczesne komputery potrafią przetwarzać miliony, jak nie miliardy liczb na sekundę. Zapisywanie na dysk jest najwolniejszą czynnością w całym ekosystemie komputerowym (poza komunikacją sieciową).

No i pozwolisz że zarzucę cytatem: "Przedwczesna optymalizacja jest źródłem wszelkiego zła". O wydajność martw się dopiero w momencie, kiedy będzie ci rzeczywiście doskwierać.

Co do pomysłu z bazą danych. Nie, to miałaby być autorska baza danych, z funkcjami wzorowanymi na SQL, np. Update(building,id,setting,value);

Po prostu mam wrażenie, że to na dłuższą metę byłoby wiele wygodniejsze niż operowanie na zwykłych zmiennych. Pytanie tylko gdzie tą bazę zapisywać i czy w ogóle trzeba ją zapisywać..
I tu się mylisz. Operowanie na zmiennych jest o wiele wygodniejsze niż pisanie zapytań - nie wspominając że niebotycznie szybsze. Oczywiście jeśli odpowiednio je zorganizujesz w klasy, kontenery, itp.

Offline Xion

  • Redaktor
    • xion.log

# Lipiec 24, 2013, 01:09:37
Cytuj
Zapisywanie na dysk jest najwolniejszą czynnością w całym ekosystemie komputerowym (poza komunikacją sieciową).
Czepiam się oczywiście, ale nawias czyni to zdanie nieprawdziwym. Dostęp do dysku (HDD) *jest* najwolniejszą czynnością w całym ekosystemie. To dlatego wynalazki w rodzaju memcached czy Redis (przesyłanie przez sieć danych które siedzą tylko w RAMie drugiego komputera) mają sens.

Bardzo przydatny link: http://architects.dzone.com/articles/every-programmer-should-know

Offline Xirdus

  • Moderator

# Lipiec 24, 2013, 01:27:15
Z komunikacją sieciową to miałem na myśli przez Internet. Po LANie to rzeczywiście komunikacja jest szybsza, czasem znacznie, niż z lokalnym dyskiem twardym, jednak jeśli wysyłasz coś poza budynek, to musisz się liczyć z lagami 15-20ms w kraju i nawet 200ms za granicę.

Offline Veldrin

  • Użytkownik

# Lipiec 24, 2013, 03:13:29
Koleś zadaje proste pytanie o bazową architekturę stanów gry, bo nigdy jeszcze nie robił apki real-time jaką jest gra i od razu masa zbędnych komentarzy. 3/4 postów do kosza.

Mówiłeś, że czytałeś artykuły, ale nie znajdujesz w nich odpowiedzi. Najwidoczniej czytałeś złe.

Hasła, które Cię interesują to:

- real-time loop
- game state pattern
- game architecture

Gwarantuje, że na ten temat powstało tyle prac naukowych, że spokojnie powinieneś znaleźć wszystkie informacje. Jeżeli nie jesteś w stanie tego zrobić - nie zrobisz nigdy, niczego.

Dużo zależy od wybranej biblioteki/silnika, czy samej technologii. Jak się zdecyduje na np. SFML2 w C++ to przy tutorialach znajdziesz i przykładowego gry 2d/3d. Poszukaj.

O podziale gry na stany w ostatnim miesiącu było kilka tematów. Pamiętam Xirdus, że nawet mnie gdzieś cytowałeś. Nie można było raz jeszcze? A kwestie "bazy danych" w grze to już bicie piany na potęgę. Zrobi tak jak będzie trzeba. Jeżeli nie - trudno.

PS. Fakt, że Irrlicht czy Ogre mają po kilkaset plików świadczy tylko o ich kiepskich twórcach.

Offline Xirdus

  • Moderator

# Lipiec 24, 2013, 03:28:59
Dużo zależy od wybranej biblioteki/silnika, czy samej technologii. Jak się zdecyduje na np. SFML2 w C++ to przy tutorialach znajdziesz i przykładowego gry 2d/3d. Poszukaj.
Akurat tu się nie zgodzę. O ile niektóre biblioteki narzucają jakiś specyficzny sposób pisania, o tyle zazwyczaj architektura kodu gry może być dowolna, według uznania autora. Gry w SDL, Allegro, SFML i innych tego typu bibliotekach pisze się bardzo podobnie.

O podziale gry na stany w ostatnim miesiącu było kilka tematów. Pamiętam Xirdus, że nawet mnie gdzieś cytowałeś. Nie można było raz jeszcze?
Ten sposób z niezależnymi stanami uważam za trochę zbyt zaawanowany dla naszego OP. Z czasem i do tego dojdzie ;)



I taka rada: nie zrażaj się jak za pierwszym razem nic ci z gry nie wyjdzie. Nikomu za pierwszym razem nie wyszło. Najważniejsze, żeby zobaczyć swoje błędy i przy następnym podejściu ich nie popełnić (za to popełnisz inne, i pewnie będziesz musiał po raz kolejny zaczynać od nowa; wtedy też się nie poddawaj, po prostu próbuj aż wyjdzie).

Offline Veldrin

  • Użytkownik

# Lipiec 24, 2013, 15:02:35
Niezależne stany to wybitnie niepoprawna nazwa, ale nie o tym jest temat.

Mówiłem o technologii, nie libkach. Inaczej to sobie zorganizujesz w kodzie na Nintendo DS, Androida, a inaczej na PC ;).

Wtrącenie o SFML sugeruje tylko, że razem z libkami ma tutoriale :).