2009-08-09 7 views
6

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

  1. rozpocząć grę
  2. kliknij „Kontynuuj”
  3. Wpisz nazwę użytkownika i hasło
  4. Kliknij przycisk „Zaloguj”
  5. Zobacz postać, gdziekolwiek byłeś, gdy się wylogowałeś

Z klient-serwer architektury perspektywy, oto co robię teraz:

[Client]

  1. Wyślij SimpleTextNetworkMessage z serwerem - {LogInRequest, ONZ: [ nazwa_użytkownika] | PW: [hasło]}
  2. przyciemnić UI i czekać na odpowiedź (timeout: 10 sekund)
  3. Otrzymują SimpleTextNetworkMessage od t on server - {LogInSuccessResponse, [Player ID]}
  4. Wyślij SimpleTextNetworkMessage z serwerem - {GetPlayerInfoRequest, [Player ID]}
  5. Otrzymują SimpleDataNetworkMessage z serwera - {GetPlayerInfoResponse, [Player Info] }
  6. Wyślij SimpleTextNetworkMessage z serwerem - {GetMapInfoRequest, [Player ID]}
  7. Otrzymują SimpleDataNetworkMessage z serwera - {GetMapInfoResponse [rzecz firmy MapData]}
  8. 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); 
     } 
    } 
} 
+0

jakie jest pytanie? Nie mogę znaleźć jednego w tekście pytania. – Mike

+0

Możesz zobaczyć, że każdy z tych procesów jest inny i wymaga innych informacji. Po stronie serwera, jak mogę zrobić coś takiego: ... –

+0

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

Odpowiedz

1

Kiedy czytam to pytasz, to wydaje się być pytaniem dla „rozszerzalny sposób realizacji przetwarzanie poleceń”.

Ze sposobu, w jaki to określasz, Twoja prośba wyraźnie wskazuje na Command Pattern.

Nie jestem osobą z C#, więc niestety nie mogę zrobić wiele pracy oceniając mnóstwo sugestii, które Google oferuje. Oto jeden, na dobry początek. http://www.c-sharpcorner.com/UploadFile/cupadhyay/CommandPatternsInCS11142005021734AM/CommandPatternsInCS.aspx

+0

Dzięki! Czytałem o tym wzorze już w odniesieniu do gier, ale ciężko jest mi zrozumieć, w jaki sposób polecenia będą miały dostęp do rzeczy, których potrzebują. Na przykład, w jaki sposób polecenie logowania może dołączyć token użytkownika do listy aktywnych użytkowników po pomyślnym wykonaniu polecenia i umieszczeniu komunikatu o powodzeniu w kolejce wysyłania? W jaki sposób zapytanie o przeniesienie postaci może przetworzyć ruch na mapie, a następnie wysłać potwierdzenie do klienta? Itd. Jeszcze raz dziękuję! –

+0

Ponownie, nie jestem osobą C#. Nie mogę zbudować twojego kucyka. Mogę zaoferować tylko sugestie z dystansu. Jeśli próbowałem to rozgryźć, zacznę od tego pytania: w jaki sposób poradziłbym sobie z tym, gdybym wykonywał zakodowane na sztywno przetwarzanie poleceń po stronie serwera podczas kompilacji? Jak dostaniesz token użytkownika, listę użytkowników, kolejkę wysyłkową? – CPerkins

Powiązane problemy