MMORPG w Delphi (Omega) - Serwer>>Klient

0

Siemka,
mam takie pytanko... myślałem jakby to można było skonstruować ale nic nie wymyśliłem ;.. ...
otóż chodzi o to, że robie gre MMORPG... (na razie się chodzi Kółkiem ;p a pod nami są kwadraty :P) i nie mam pojęcia zielonego jak zrobić komunikacje klienta z serwerem... tzn. wiem jak się podłączyć itd... itd... (biblioteki z Delphi 7 + TServerSocket czy jakoś... to te standardowe w Enterprise) ale niewiem np. jak zrobić system logowania... zapisywania poziomu jaki ma gracz i co NAJWAŻNIEJSZE położenia naszego kułka na mapie (20x20 kratek ;p w tym same kułka ;]) a najciekawsze :P to niewiem jak zrobić to, żeby np. Gracz 1 widział Gracza 2 ;/... Nie mam zielonego pojęcia jak to zrobić... Czytałem pare FAQ/Tutoriali itd itd ale nie znalazłem nic co by mi się przydało...

Jeżeli ktoś ma pomysł jak to można byłoby skonstruować to niech pisze posta ;] ja po prostu już nie mam pomysłu.

Pozdro, Malyna

@dodam ;]
Prosze o szybkoom odpowiedz :)

0

To nie jest kwestia 'czajenia' tylko ogólności Twoich pytań. Właściwie prosisz o wymyślenie podstaw engine'u. Czym jest programowanie jak nie właśnie tym? Wcale nie wklepaniem kodu - to już jest proste (choć pracochłonne).

Jak nie masz pomysłu jak to zrobić, pomyśl i tydzień, aż dojdziesz do jakichś wniosków.

0

przykro mi to stwierdzić, ale ja już na tym myśle prawie tydzień... no bo 5 dni ;], a do wniosków doszedlem takich, że jak się kogoś nie poradze to za **** nic nie wymyśle...

@Edit

czy wklepanie jest pracochłonne ? ;] raczej nie do końca :)

0
malyna napisał(a)

widze, nikt nie czai o co chodzi ;] ?

Tak to napisałeś że ja siedząc nad tym sam ledwo czaje o co chodzi :D
to może ja spróbuje coś powiedzieć od siebie ...

Wygląda to tak, że:
na każdym kliencie jest TShape w kształcie kółka i sie nim porusza .. to gdzie się znajduje ma być przekazywane do serwera a on ma to przekazywac dalej do pozostałych klientów.. komunikacja odbywa się w oparciu o gniazda.. komponenty TClientSocket i TServerSocket .. jak na razie myślałem aby wysyłać komunikaty przez Socket.SendText np. 'SetPos "136" "427"' i serwer by to odpowiednio zinterpretował jako przemieszczenie kółka w miejsce (136,427).
Co o tym myślicie? Może jakoś inaczej zrealizować tą komunikację?

0

Arthan ~ To juz lepiej wyslac jakis bajt kontrolny z typem pakietu i dwa bajty (ew shorty) wspolrzednych, lacznie 5b na caly pakiet. (poza tym twoim sposobem to nie wiadomo gdzie konczy sie jeden pakiet /w sensie logicznym, nie transportowym/ a zaczyna drugi)

malyna ~ Jak twoj user wykonuje ruch to wysylasz pakiet do serwera a ten rozsyla go wszystkim innym - myslales tydzien i tego nie wymysliles? W ServerSocket masz liste klientow, wystarczy zwykly for. Kwestia tylko poinformowania graczy o istnieniu siebie nawzajem zeby klienty mogly se wypelnic np tablice klas reprezentujacych gracza.

Ty chcesz zrobic Massiva? :/

0

@Wolverine
to wymyśliłem, przykro mi :) ale nic na temat logowania...

Massiva xD ? no może nie... ale 10 graczy góra...

0
malyna napisał(a)

czy wklepanie jest pracochłonne ? ;] raczej nie do końca :)

W takim razie nie wiesz na co się porywasz.

Po pierwsze musisz napisać serwer wieloklientowy (najprostsze rozwiązanie to serwer wielowątkowy). Serwer ten powinien mieć dostęp do jakiejś bazy danych.

Klient powinien łączyć się do serwera i od tego momentu oba powinny zarówno oczekiwać na dane, jak i móc wysyłać (nie tak jak zwykle, że to klient wysyła zapytania, serwer odpowiada).

Przesyłanie danych proponuję zrealizować w oparciu o następujący format:

rozmiar:DWORD;
polecenie: WORD;
dane:array[0..rozmiar] of byte;

Podczas odczytu zawsze czekasz na 4 bajty danych, po ich odebraniu czekasz na 2 bajty, a potem czekasz na ilość bajtów przekazaną przez rozmiar.

Zmienna polecenie to po prostu wartości liczbowe (proponuję stałe), którym przypisano konkretne znaczenie.

Klient powinien trzymać dane odnośnie aktualnie prezentowanego stanu gry (rysujesz po czym chcesz), a jak gracz wykonuje przesunięcie, wysyłać je do serwera, który - jeśli mapa pozwala - rozsyła klientom (włącznie z tym, który się porusza) informację o zmianie pozycji danego gracza.

Jeśli serwer będzie wielowątkowy, po zalogowaniu użytkownika, w ramach zmiennych wątku, możesz trzymać ID gracza podłączonego na danym socket'cie, więc identyfikacja będzie banalna.

Więcej wyobraźni..

0

dobra ;p troche mi to rozjaśniło w głowie ;p, ale może jakaś prosta instrukcja... jak zrobić taki serwer wielowątkowy... ?

@Edit

Bazy? może SQLa :D ?

@Edit2

PS. Czy taki serwer lepiej robić n bibliotekach Indy czy tych z Delphi 7 Enterprisse? (TServeerSocket bodajrze)

0

Jak ma wyglądać serwer wielowątkowy? ;P
To znaczy.. co by miało się znajdować w poszczególnych wątkach a co w wątku głównym aplikacji? Rozumiem że każdy wątek miałby się zajmować poszczególnym klientem.. serwerem jest u mnie TServerSocket, jak ja go mam "podzelić" między wątki?

Co do formatu danych myślę, że nie będzie potrzebne więcej niż 256 poleceń, zbyt dużą ilość danych też nie mam zamiaru przesyłać, więc bajt na polecenie i dwa bajty na Rozmiar (może nawet też bajt ;P ) w zupełności wystarczy, bo co ja bym miał tam tyle przesyłać?

0

Serwer wielowątkowy działa tak, że w wątku głównym znajduje się obsługa gniazda nasłuchującego, a w wątkach pobocznych obsługiwane są konkretne połączenia klientów. Dzięki temu czekanie na odpowiedź od jednego klienta nie blokuje innych.

Można też to wykonać instrukcjami zbiorowego czekania (Select i analogiczne), ale wielowątkowość daje Ci jeszcze kilka zalet - choćby łatwość pisania kodu.

To nie TServerSocket ma być dzielony na wątki, ale gniazda klientów do niego połączonych.

0

dzięki za info Szczawik ;]

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