Aktualizacja: przepraszam, może moje pytanie nie jest wystarczająco jasne. Czytałem o wzorzec polecenia, ale niestety nie użyłem go sam. Próbuję dowiedzieć się, w jaki sposób mogę go użyć (lub inny wzorzec), aby zdarzenia gry były wystarczająco abstrakcyjne, aby serwer mógł je przetworzyć za pomocą pojedynczej metody Process(). Moim głównym zawieszeniem tutaj jest upewnienie się, że wydarzenia w grze otrzymują wystarczającą ilość informacji, aby faktycznie ZROBIĆ, co należy zrobić (np. Zalogować użytkownika i dodać je do listy aktywnych użytkowników, przesłać dane mapy, przenieść gracza itp.). Odpowiedni przykład byłby bardzo doceniony.Co to jest rozszerzalny sposób implementowania przetwarzania po stronie serwera w MMORPG?
Jestem nowy w rozwoju gier, ale postanowiłem rozpocząć pracę nad (stosunkowo) prostym, 2D MMORPG w wolnym czasie. Uważałbym się za bardzo zdolnego programistę i mam dobry fundament umiejętności, ale wciąż zmagam się z niektórymi projektami związanymi z grą klient-serwer. W szczególności trudno mi myśleć o rozszerzalnym sposobie przetwarzania poleceń.Pozwól mi zapewnić funkcjonalną przykład:
zalogować Zamówienie
- rozpocząć grę
- kliknij „Kontynuuj”
- Wpisz nazwę użytkownika i hasło
- Kliknij przycisk „Zaloguj”
- Zobacz postać, gdziekolwiek byłeś, gdy się wylogowałeś
Z klient-serwer architektury perspektywy, oto co robię teraz:
[Client]
- Wyślij SimpleTextNetworkMessage z serwerem - {LogInRequest, ONZ: [ nazwa_użytkownika] | PW: [hasło]}
- przyciemnić UI i czekać na odpowiedź (timeout: 10 sekund)
- Otrzymują SimpleTextNetworkMessage od t on server - {LogInSuccessResponse, [Player ID]}
- Wyślij SimpleTextNetworkMessage z serwerem - {GetPlayerInfoRequest, [Player ID]}
- Otrzymują SimpleDataNetworkMessage z serwera - {GetPlayerInfoResponse, [Player Info] }
- Wyślij SimpleTextNetworkMessage z serwerem - {GetMapInfoRequest, [Player ID]}
- Otrzymują SimpleDataNetworkMessage z serwera - {GetMapInfoResponse [rzecz firmy MapData]}
- Draw ekranu
Mój przykład wymienia trzy najważniejsze wydarzenia, które występują:
Process Zaloguj
zweryfikować informacje użytkownikowi pod warunkiem, pobranie informacji o odtwarzaczu z bazy danych (HP , MP, ostatnia lokalizacja itp.) I skojarzyć odtwarzacz z mapą i połączeniem.
Get Gracz Info
Odeślij informacje o statystykach gracza, sprzęt, doświadczenie, aktualna mapa identyfikacyjnych, i wszystko, co musi być wyświetlany w interfejsie użytkownika.
Get Map Info
Wyślij informację do gracza o wszystkich płytek w promieniu 50 płytek ... to powinno zawierać informacje Płytka mapie trójwarstwowej oraz rozmieszczenie i nazwy NPC/potwory/gracze; kiedy gracz się ruszy, więcej informacji o mapie będzie wymaganych/zaktualizowanych.
Możesz zobaczyć, że każdy z tych procesów jest inny i wymaga innych informacji. Na stronie serwera, jak można zrobić coś takiego:
while (ServerIsRunning)
{
foreach (Client c in clients)
{
eventQueue.AddList(c.ReceiveAll());
}
foreach(GameEvent event in eventQueue)
{
event.Process();
}
int[] keys = messageQueue.Keys;
foreach (int key in keys)
{
Client c = clients.Get(key);
foreach(NetworkMessage message in messageQueue[key])
{
c.Send(message);
}
}
}
jakie jest pytanie? Nie mogę znaleźć jednego w tekście pytania. – Mike
Możesz zobaczyć, że każdy z tych procesów jest inny i wymaga innych informacji. Po stronie serwera, jak mogę zrobić coś takiego: ... –
Przeczytałem to pytanie trzy razy i wydaje się to interesujące, ale dla mojego życia nie mogę dowiedzieć się, o co prosisz. Wysłałeś pseudokod dla pętli obsługi zdarzeń na serwerze; co chcesz zmienić na ten temat? – Nelson