Rozproszenie gry c++

0

Witam, napisałem prosty zarys gry piłkarzyki w c++, w której jest dwóch graczy i jeden przemieszcza piłkarzykami WASD a drugi strzałkami i na jednym kompie to działa. Mam pytanie, jakich użyć tchnologii, żeby rozproszyć to na dwa komputery, tzn jeden operator na swoim drugi na swoim i żeby grali między sobą? Tak jakąś najprostszą techniką, nie musi być najbardziej efektywna. Ktoś może ma jakiś pomysł?

0

Musisz stworzyć serwer. Przez, który dane będą przesyłane. Powinieneś zainteresować się TCP. I wtedy, każdy ruch musisz przesłać do serwera, a ten przekazuje to wszystkich, którzy są połączeni z danym serwerem.

@Ps. Przykładowe dane : Piłkarz1 -> pozycja(122,333)

0

Zależy gdzie chcesz mieć tą "prostotę". Możesz to zrobić socketami co jest niskopoziomowe i przez to "proste", a możesz przez CORBA i wtedy prostota będzie w samej implemenatacji gry ale technologia prosta nie będzie.

0

@ShookTea Jeżeli przysłanie danych będzie bezpośrednie to przeważnie da się grać tylko po sieci LAN, gdyż większość dostawców internetowych blokuje porty i trudno bd wtedy wysłać dane.

0

Prostota, to chodzi o to żeby było łatwo napisać lub jakiś wzór żebym znalazł. W zasadzie zależy mi na czasie, jak najszybciej to ogarnąć więc pomijam detale wydajności, efektywności czy zabezpieczeń.
Moze być bezpośrednio lub nie, obojętne, ważne żebym jak miał dwa kompa swoje to żeby taka gierka działała mi. Dlatego zastanawiam się jakby mi to było najłatwiej rozwiązać, pisząc pod c++. Lapki podłączone do jednej sieci przez wifi wystarczą czy musze kabelkiem jakoś?

0

Może być przez wifi jak i przez kabel, jest to obojętne. Nie napisałeś o jakie biblioteki się opierasz. Bo najprościej według mnie byś miał korzystając z framework-a Qt i bibliotekę QTcpSocket.

Ps. Znalazłem poradnik, jak ktoś to robi w tym framework-u.
http://blog.matthew.org.pl/2010/03/13/kurs-qt-czesc-7-tcp/

0

Miałem dwie opcje zrobić to jakoś przez WinSock lub użyć MPI, jednak poczytam o tym Qt. Bo w sumie musze wysylać tylko pozycje z macierzy (nowe pozycje) do drugiego uzytkownika zeby mu sie zaktualizowało boisko na ekranie.

1

Możesz też zrobić to prościej np. poprzez bazę SQL :) Tworzysz sobie serwer MySQL np. programem WampServer i potem w programie przesyłasz do bazy wszystkie potrzebne dane a druga osoba odczytuje i nawzajem.

6
maniek1310 napisał(a):

Możesz też zrobić to prościej np. poprzez bazę SQL :) Tworzysz sobie serwer MySQL np. programem WampServer i potem w programie przesyłasz do bazy wszystkie potrzebne dane a druga osoba odczytuje i nawzajem.

Zróbmy plebiscyt: kto wymyśli gorszy i bardziej niedorzeczny sposób komunikacji pomiędzy dwoma klientami gry toczącej się w czasie rzeczywistym... Takie rozwiązanie to nawet dla turowej gry byłoby mega słabe.

0

A jeżeli chciałbym rozproszyć prosto, tzn klient - serwer, gdzie klient przesyła swój ruch (lewo, prawo, przod, tył) i w zaleznosci co dostanie serwer wykonuje swoj ruch, tzn tak jakby gra jednego gracza z komputerem, to przy c++ i zrobieniu osobnego wątku dla gracza (wymagane) najlepiej będzie mi zastosować biblioteke WinSock?

0

Mam takie pytanie, zacząłem robić na socketach więc ok, tylko jak chce połączyć np. serwer na jednym kompie a klienta na drugim, żeby działało na więcej kompach i musze podać adres IP serwera a nie localhost, to jak go wydobyć, żeby się łączyło?

0

Albo wstukać ręcznie jak w niektórych grach siczowych.
Albo zrobić UDP latarnie.

0

Ip serwera to będzie takie jakie masz przypisane do tego komputera gdzie masz postawiony serwer.

Dla topornych :)
https://www.youtube.com/watch?v=OeHC73GJsO8

0

Ok już wiem, działa. Mam jeszcze pytanko, działa mi serwer dla jednego klienta, jednak chciałbym zrobić dla przynajmniej dwóch, żeby dwóch sie mogło połączyć lub więcej. (celem i tak będzie żeby klient1 wysyłał coś na serwer i zostało to przekazywane do klienta2 i pozniej klient2 cos wysyła do 1 i takie ruchy w petli).

Jednak jak zrobić z połączeniem dla wielu klientów?
Mam coś takiego:

 SOCKET mainSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); // tworzenie gniazda socket
if( mainSocket == INVALID_SOCKET )
{
    printf( "Error creating socket: %ld\n", WSAGetLastError() );
    WSACleanup();
    return 1;
}

sockaddr_in service;
memset( & service, 0, sizeof( service ) );
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr( "192.168.1.173" ); // zdefiniowanie adresu ip
service.sin_port = htons( 27015 ); // zdefiniowanie portu

if( bind( mainSocket,( SOCKADDR * ) & service, sizeof( service ) ) == SOCKET_ERROR ) // przypisanie do gniazda portu i adresu
{
    printf( "bind() failed.\n" );
    closesocket( mainSocket );
    return 1;
}

if( listen( mainSocket, 1 ) == SOCKET_ERROR ) // nasluchiwanie przez serwer
     printf( "Error listening on socket.\n" );

SOCKET acceptSocket = SOCKET_ERROR;
printf( "Waiting for a client to connect...\n" );

if( acceptSocket == SOCKET_ERROR )
{
    acceptSocket = accept( mainSocket, NULL, NULL );
}
printf( "Client connected.\n" );
mainSocket = acceptSocket;
0

Osobne wątki dla każdego klienta.

0

Czyli na przykład na serwerze stworzyć dla klienta - wątek, przyjmę że max dwóch klientów to mi i to utworzyć dwa wątki za pomocą process.h i beignthread tylko jak to później sklecić, żeby oczekiwał na połaczenie dwóch klientów(wątków) i jeśli jest są połączenie to jakas tam wymiana danych?

0

Uzyj jakiejs biblioteki sensownej jak czlowiek, a nie API systemowego. No chyba, ze tak bardzo kochasz miliony problemow...

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