Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

Witam. Tak się ostatnio bawię i nie wiem czy wyjdzie z tego coś poważniejszego, ale zawsze to jakiś krok w przód :sp_ike:

Zastanawiam się jak wysłać mapkę z serwera do klienta, tak by wszystkie dane na pewno doszły i nie obciążając tym samym serwera.

Robiąc zwykłą metodą podobną do wysyłania wiadomości czatu przy wolniejszych łączach nie pokazywały się wszystkie elementy mapki

Opublikowano

Jak mapa jest w pliku, np.

obj[1]=objLamp

objx[1] = 200

objy[1] = 200

To wysyłałbym w pętli for, po kolei, nazwe, x, y, a client, by tworzyl na mapie, tak mialem u siebie, i dobrze bylo ;p

 

@EDIT: Podobnie miałem bronie ;p

  • Administratorzy
Opublikowano

Tak, najlepiej wyślij 10Mb w jednej sekundzie.... Roki, to nie zda egzaminu :) Może na localhoście działa, ale poza nim nie.

Opublikowano
Używaj TCP, a inną sprawą jak wygląda sama mapka, mógłbyś podać szczegóły?

obiekty rozłożone w siatce 32x32 lub 16x16, jeszcze się nie zdecydowałem. do tego dochodzą jeszcze zmienne startowe w większości obiektów no i trochę tilesów. Mapka ma rozmiar póki co 1024x768

Opublikowano

dla mnie wogole glupotą jest wysyłanie map podczas gry, jesli koniecznie musisz przeslac jakas mape to zrob oddzielna aplikacje jako downloader chociaz i tak wiekszego sensu w tym nie widze.

Opublikowano

I potem każdy server wygląda tak samo...

 

Tak samo ? no jesli przerabiasz przykład to tak, ale jesli robisz swoją mapkę nigdy nie bedzie taka sama jak inne, przeciez nie musisz robic w aplikacji jednej mapy i reszty przesyłać bo nie ma po co, tylko niepotrzebnie zmulisz łącze i utrudnisz uzytkownikom gre. Pozatym nawet jesli musisz dodać jakąś mapkę to albo jesli trzymasz ją w oddzielnym pliku udostępniasz do pobrania czy to przez swoj downloader czy to przez pobieranie na stronie i problemu nie ma. Tak robią w mmo, zawsze puki nie uaktualnisz wersji nie grasz bo sie downloader włancza, i to jest myk.

  • Administratorzy
Opublikowano

Dokładnie. Mapy jako update możesz umieścić normalnie na WWW, na pierwszym lepszym hostingu i przy starcie gra sprawdza czy jest update, np. wysyłając do PHP zapytanie które zwraca, czy gra jest akutalna czy potrzebny jest update. Oczywiście jak www nie działa to też zakładasz sobie, że gra jest aktualna/nieaktualna jak tam chcesz i na tej podstawie zezwalasz/odmawiasz dalszej gry. Zawsze możesz dodatkowo przy starcie klienta wysyłać do serwera gry jakieś id wersji mapy i ten najwyżej nie pozwoli się zalogować. Absolutnie odradzam wysyłania tych danych na zasadzie klient<>serwer, bo niepotrzebnie zamulisz łącze.

Opublikowano

Jeśli wszystko jest wyrównywane do siatki to w sumie nie musisz wysyłać dokładnej pozycji x,y tylko jej krotność 32 czy 16, ograniczysz to do 2 bajtów. Więc ja bym zrobił to tak, dla serwera, w oddzielnym obiekcie o nazwie np. WysylaczMapy:

 

 

GML (Create)
socket = -1; // ID socketa klienta do którego serwer wyśle dane

krok = 0; // Czyli ktora operacje bedziemy wykonywac

alarm[0] = 300; // Timeout 30 sekund</span></span>
GML (Alarm0)
// Sprawdz czy socket jest polaczony

if( socket_podlaczony( socket ) )

zamknij_socket( socket ); // Zamknij jesli tak

// Zniszcz

show_debug_message( 'Wyslanie mapy nie powiodlo sie.' );

instance_destroy();

GML (Step)
// Sprawdzenie czy przekazano ID socketa i czy jest on polaczony

switch( krok )

{

// Wyslanie pakietu inicjujacego

case 0:

wyczysc_bufor();

dodaj_do_bufora( 1 ); // ID pakietu

dodaj_do_bufora( ilosc_obiektow ); // Ilosc obiektow

dodaj_do_bufora( ilosc_tilesetow ); // Ilosc tilesetow

wyslij_bufor( socket );

 

alarm[0] = 300; // Wyzeruj timeout

// Nastepny krok

krok += 1;

break;

 

// Oczekiwanie potwierdzenia odbioru pakietu inicjujacego

case 1:

if( odebrano_dane() )

{

alarm[0] = 300; // Wyzeruj timeout

if( odczytaj_z_bufora() == 1 )

krok += 1; // Nastepny krok

}

break;

 

// Wysylanie okietow

case 2:

wyczysc_bufor();

dodaj_do_bufora( 2 ); // ID pakietu

dodaj_do_bufora( obiekty_wyslane ); // ID obiektu

with( obiekty[obiekty_wyslane] )

{

dodaj_do_bufora( x ); // x obiektu

dodaj_do_bufora( y ); // y obiektu

// ... inne zmienne

}

wyslij_bufor( socket );

 

alarm[0] = 300; // Wyzeruj timeout

krok += 1; // Nastepny krok

break;

 

// Oczekiwanie potwierdzenia odbioru obiektu

case 3:

if( odebrano_dane() )

{

alarm[0] = 300; // Wyzeruj timeout

if( odczytaj_z_bufora() == 2 )

{

obiekty_wyslane += 1;

 

if( obiekty_wyslane < obiekty_do_wyslania )

krok -= 1; // Poprzedni krok

else

krok += 1; // Nastepny krok

}

}

break;

 

// Wysylanie tilesetow

case 4:

wyczysc_bufor();

dodaj_do_bufora( 3 ); // ID pakietu

dodaj_do_bufora( tilesety_wyslane ); // ID tileseta

with( tilesety[tilesety_wyslane] )

{

dodaj_do_bufora( x ); // x tilesetu

dodaj_do_bufora( y ); // y tilesetu

// ... inne zmienne

}

wyslij_bufor( socket );

 

alarm[0] = 300; // Wyzeruj timeout

krok += 1; // Nastepny krok

break;

 

// Oczekiwanie potwierdzenia odbioru tilesetu

case 5:

if( odebrano_dane() )

{

alarm[0] = 300; // Wyzeruj timeout

if( odczytaj_z_bufora() == 3 )

{

tilesety_wyslane += 1;

 

if( tilesety_wyslane < tilesety_do_wyslania )

krok -= 1; // Poprzedni krok

else

krok += 1; // Nastepny krok

}

}

break;

 

// Wyslanie pakietu konczacego

case 6:

wyczysc_bufor();

dodaj_do_bufora( 4 ); // ID pakietu

wyslij_bufor( socket );

 

alarm[0] = 300; // Wyzeruj timeout

// Nastepny krok

krok += 1;

break;

 

// Oczekiwanie potwierdzenia odbioru pakietu inicjujacego

case 7:

if( odebrano_dane() )

{

if( odczytaj_z_bufora() == 4 )

{

instance_destroy();

}

}

break;

}

Obiekt tworzymy tak:
GML
i =instance_create(WysylaczMapy);

i.socket = id_socketa_klienta;

Dla klienta analogicznie, odpowiada tylko na wiadomości serwera.
Opublikowano

Do wszystkich co twierdzą, że wysyłanie mapy podczas gry jest bezsensu, nie nie jest. W Tibii jest takie rozwiązanie i nikt nie narzeka, że laguje, wręcz przeciwnie. >.> I dzięki czemu mapa może być na bierząco modyfikowana.

Opublikowano

No, o to mi chodziło mówiąc że każdy server potem ma te samą mapę, że np. ktoś ma server mojej gry, hostuje, ale wiele innych osób też hostuje, a co za tym idzie na każdym servie jest ta sama mapa, no i jak potem zrobić np. ranking serverów, cokolwiek?

Opublikowano
Do wszystkich co twierdzą, że wysyłanie mapy podczas gry jest bezsensu, nie nie jest. W Tibii jest takie rozwiązanie i nikt nie narzeka, że laguje, wręcz przeciwnie. >.> I dzięki czemu mapa może być na bierząco modyfikowana.

 

Nie wzieles tylko pod uwage kilku istotnych faktów, takich jak szybkość łącza ich serwerów, tego że podczas takich zmian dodawany nie jest jakiś ogromny teren tylko najwyżej mały lub wogole to są zmiany kosmetyczne polegające na zmianie kilku gifowych grafik. Dla wiekszych rzeczy ktore dodają przecież są updaty clienta.

 

No, o to mi chodziło mówiąc że każdy server potem ma te samą mapę, że np. ktoś ma server mojej gry, hostuje, ale wiele innych osób też hostuje, a co za tym idzie na każdym servie jest ta sama mapa, no i jak potem zrobić np. ranking serverów, cokolwiek?

 

Nie musi być ta sama jesli udostępnisz ich kilka rob zrobisz jakiś mapeditor :P.

Ranking serwerów to jest błahostka bo przecież nie rozróżniasz serwerów po mapie tylko po jakimś unikalnym identyfikatorze!

Opublikowano
Nie wzieles tylko pod uwage kilku istotnych faktów, takich jak szybkość łącza ich serwerów, tego że podczas takich zmian dodawany nie jest jakiś ogromny teren tylko najwyżej mały lub wogole to są zmiany kosmetyczne polegające na zmianie kilku gifowych grafik. Dla wiekszych rzeczy ktore dodają przecież są updaty clienta.

Ja nie mówie o grafice do mapy : O, tylko o pozycjach przedmitów, tilesów. Przesyłanie grafiki to inna sprawa, powinno być to załatwiane poprzed update.

Opublikowano

Ja bym to zrobił przez ftp

 

serwer tworzy plik tekstowy z położeniem wszystkich obiektów i wysyła na ftp. Aplikacja klienta wykrywa że serwer używa innej mapy, więc łączy się z ftp, ściąga na dysk, przetwarza i można grać. Coś na kształt contentu ściąganego jak ktoś użyje custom mapy do cs'a.

  • Administratorzy
Opublikowano
To jest żaden argument. Może odrazu do zrobienia gry zaprzęgnijmy HTTP, albo nie, SSH!

 

POP3.

  • 3 tygodnie później...
Opublikowano

Przepraszam że odświeżam. Ale jak np chciałbym zrobić tak że jak gracz wejdzie do gry to serw wysyła mape.. Podobnie jak u kolegi mam siatkę 32x32. W tym stringu może być ponad 500obj. Jak już mówiłem mapka jest wysyłana tylko podczas gdy gracz wchodzi pierwszy raz do gry. Jak zrobić jakiś pasek postępu czy coś w tym stylu?

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...