Skocz do zawartości

39dll i wysyłanie mapki (bądź podobnych zestawów danych)


Marzec

Rekomendowane odpowiedzi

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

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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.
Odnośnik do komentarza
Udostępnij na innych stronach

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?

Odnośnik do komentarza
Udostępnij na innych stronach

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!

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...

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?

Odnośnik do komentarza
Udostępnij na innych stronach

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ę...