Implementacja dla wielu graczy. Czy mogę ją wdrożyć później, jeśli zdecyduję?

15

Planuję użyć XNA do stworzenia projektu gry. W tej chwili nie jestem całkowicie pewien, czy chcę dodać funkcjonalność dla wielu graczy, czy nie, ponieważ mam wiele innych problemów do rozwiązania, w których wciąż jestem nowy. Nie chcę, żeby projekt wymknął się spod kontroli.

Moje pytanie brzmi: jeśli przejdę do mojego projektu bez planu dodania wsparcia dla wielu graczy, czy łatwo jest cofnąć się (zazwyczaj nie jest) i dodać kod niezbędny do przechwycenia gry wieloosobowej?

Bryan Harrington
źródło

Odpowiedzi:

24

Oto solidna rada zaczerpnięta z podręcznika biblioteki sieci Zoidcom :

Jeśli twój projekt jest na etapie planowania, zaleca się zaprojektowanie projektu do pracy w sieci od samego początku. Włączenie kodu sieciowego w późnym stanie projektu najprawdopodobniej doprowadzi do masowego refaktoryzacji lub dużej ilości włamań, czego skutkiem będzie trudny do utrzymania i błędny kod.

Najczystszym sposobem jest zaimplementowanie całej gry tak, jakby była czystą grą sieciową. Oznacza to, że zaimplementuj kod dla dedykowanego serwera i zaimplementuj ten kod tylko jako kod serwera. Zaimplementuj kod klienta gry w podobny sposób. Serwer i klient mogą działać w tym samym procesie i nawet nie muszą używać prawdziwego gniazda sieciowego, ale powinny być osobnymi jednostkami, a cały kod powinien być zaprojektowany w taki sposób. Kiedy gracz skacze, nie zmieniaj bezpośrednio wektora skoku gracza, ale wyślij pakiet „wciśnięty klawiszem” na serwer i pozwól temu serwerowi to obsłużyć.

Oznacza to, że nawet w grze jednoosobowej w tle działa niewidoczny serwer. Wersja tej samej gry dla wielu graczy musi tylko połączyć się ze zdalnym serwerem zamiast z lokalną, et etila, multiplayer zrobiony. Zaletami tego są:

brak oddzielnego kodu dla pojedynczego i dla wielu graczy, kod sieci jest testowany i rozwijany podczas całego czystego kodu projektu

Projekty wykorzystujące ten schemat to prawie wszystkie gry wykorzystujące dowolny z silników Quake, Civilization 4, Neverwinter Nights i wiele innych.

Do połączenia klienta i serwera w tym samym procesie z zerowym opóźnieniem można użyć gniazd lokalnych. Są one dostarczane przez Zoidcom i przekazują pakiety bezpośrednio z jednego ZCom_Control do drugiego, bez przechodzenia przez gniazdo na poziomie systemu operacyjnego.

Leftium
źródło
Wygląda na to, że jest to konfiguracja dla czystego autorytetu serwera, którego nienawidzę. Jeśli twój ping do serwera jest niski, gra dobrze. Ale gdy ping staje się zbyt wysoki, akcje na ekranie są opóźniane. Zdecydowanie wolę metodę używaną przez silnik źródłowy, klient uruchamia fizykę i rzeczy lokalnie, a każda akcja natychmiast się pojawia, ale serwer nadal sprawdza ją, aby upewnić się, że ludzie nie hakują, i jeśli są jakieś niespójności w tym, co powinno się wydarzyć , serwer wysyła poprawny stan do odtwarzacza i zastępuje symulację klienta nowymi danymi.
AttackingHobo
8
@AttackingHobo: Po prostu opisujesz przewidywania klientów. Możesz dobrze przewidywać klienta i uprawnienia serwera, i wcale nie wyklucza to architektury opisanej w instrukcji Zoidcom.
@AttackingHobo @Joe: I Zoidcom faktycznie obsługuje przewidywanie po stronie klienta ^^
Leftium
2

Zgadzam się z radą cytowaną w odpowiedzi Leftium; zaprojektuj go do pracy w sieci od samego początku, ponieważ nie będziesz mógł go później dodać .

Gdy pierwszy raz próbowałem stworzyć grę wieloosobową (nawet nie próbowałem stworzyć gry dla jednego gracza!), Pomyślałem, że najpierw uruchomię grę, a potem dodam do sieci. Kiepski pomysł. Pozostał mi prototyp naprawdę nudnej gry dla jednego gracza i nie mam pojęcia, jak ją przekształcić w grę wieloosobową. Zlikwidowałem go całkowicie i zacząłem od nowa, tym razem od samego początku pisząc kod sieciowy dla wielu graczy. Wszystko kliknęło.

Jestem pewien, że nie jest niemożliwe rozpoczęcie gry dla jednego gracza i dodanie funkcji gry wieloosobowej. Jeśli się nad tym zastanowisz, zaplanuj to poprawnie i upewnij się, że znasz swoją strategię, to spróbuj. Myślę, że byłoby ciekawą łamigłówką przynajmniej. Ale naprawdę upewnij się, że znasz swój plan dodawania sieci.

Myślę, że jest środek (chociaż nigdy tego nie próbowałem). Możesz napisać fikcyjne klasy dotyczące funkcji sieciowych / trybu wieloosobowego i pilnie z nich korzystać, pisząc grę dla jednego gracza. Później, jeśli zdecydujesz się wdrożyć grę wieloosobową, po prostu wypełnij klasy manekina i będziesz w większości gotowy. To bardzo zbliża się do metody serwer / klient, ale możesz być w stanie uciec od mniejszej pracy; w końcu gra dla jednego gracza jest łatwiejsza niż gra dla wielu graczy, więc jeśli masz zamiar napisać swoją grę dla jednego gracza jak grę dla wielu graczy, to dlaczego nie po prostu uczynić z niej gry dla wielu graczy?

Ricket
źródło