RazzorFlame Temat założony przez niniejszego użytkownika |
[SFML] Przekazywanie połączeń do vectora/kontenera » 2013-02-14 11:27:58 Witam. Chciałbym się zapytać czy jeśli zrobię np. tak: vector < sf::SocketTCP > Clients;
Listener.Accept(...); Clients.push_back( client );
to czy client utraci coś i jeśli będe się odwolywal: Clients[..].Receive/Send to czy to zadziała bez szwanku, czy też trzeba to przez referencje dodać do vectora :P |
|
DejaVu |
» 2013-02-14 14:18:59 Poprawnie będzie tak:
vector < sf::SocketTCP * > Clients;
|
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-02-14 16:11:21 Mógłbyś wytłumaczyć dlaczego? |
|
kubawal |
» 2013-02-14 16:15:38 Jeśli wstawiasz do kontenera klas bazowych obiekt klasy pochodnej i sizeof( Bazowa ) < sizeof( Pochodna ) , to obiekt zostanie pocięty. /edit: wygląda to tak Pamięć po: vector < Bazowa > vecA; vecA.push_back( Bazowa(...) );
vector < Bazowa > vecB; vecB.push_back( Pochodna(...) );
Układ pamięci: vecA: |Bazowa|Bazowa|Bazowa|Bazowa|... vecB: |Pochodna|Pochodna|Pochodna|Pochodna|...
I jeśli użyjesz takiej instrukcji: To zostanie wykorzystany fragment pamięci: a|Poch
Czyli zostanie pocięty! |
|
pekfos |
» 2013-02-14 16:40:20 Uwaga: post wyżej jest bez sensu! |
Obiekt typu pochodnego zostanie przycięty do rozmiaru typu bazowego. "Układ pamięci" vecA: |Bazowa|Bazowa|Bazowa|Bazowa|... vecB: |Pochod|Pochod|Pochod|Pochod|... Dlatego przypisując obiekt klasy pochodnej do tablicy obiektów klasy bazowej nie musimy się martwić, że dojdzie do uszkodzenia innych elementów i przepełnienia bufora (które wyraźnie widać na tych układach). |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-02-14 17:51:56 Ok rozumiem, ale jeśli mam własną klasę: class GameClient;
class GamePlayer { public: GameClient mClient; };
class GameClient { public: sf::IPAddress mAddress; sf::SocketTCP mSocket; };
vector < GamePlayer > players;
To to zadziała? BTW. Robie gre mmo, i mam problem. Uznałem że to nadaje się do umieszczenia w tym temacie bo mam podobny uklad klas do przykladu powyżej. I tak. Kiedy wysylam dane z Servera do Clienta wszystko działa. Kiedy client wysyla polecenie do Serwera (chodzenie postacią) to też działa. Tyle że jest jeden szkopuł. Ogólnie dostaje wiadomość z komendą nawet sprawdzałem, więc dzieje sie to co chce (chodzi że potwierdza się np. command=="PLAYER_GO_UP") w serwerze też sobie wypisuje aktualną pozycje gracza i jest dobrze. Co obieg petli wysylam paczke do clienta, to też działa ale nie w pełni. Domyślną pozycje gracza ustawiłem na (300,300) i dobrze, wyświetla się. Kiedy jednak naciskam klawisz strzalki do góry, wypisuje poprawnie to co powinno wypisać. Jak mówiłem na serwerze wszystko jest dobrze i zmienia się pozycja. Wtedy są wysyłane dane do Clienta. Client pomyślnie odbiera, ale pozycja jest zawsze ta domyślna. Nigdzie w kodzie ani clienta, ani serwera nie resetuje tego. I prosze was, oszczędźcie sobie mówienia: "Ojoj to za trudne, nie dasz rady." <- to już moja sprawa. Kiedyś już mnie ktoś tak potraktował, ale nie pamiętam czy to na tym forum, ale tylko tak na przyszłość mówie :] Myśle że jasno wyjaśniłem problem, a dodałem go tu bo wydaje mi się że coś w vectorze szwankuje bo czytałem troche o tym, miedzy innymi w przypadku menedżera tekstur w SFML że sie nie nadaje vector. EDIT: W między czasie coś popróbuje to rozwiązać i będę informował na bieżąco. |
|
pekfos |
» 2013-02-14 18:04:01 "Ojoj to za trudne, nie dasz rady"
..opisać poprawnie problemu. Gdyby to był oddzielny temat (a powinien być), to by trafił do bezużytecznych. Opisałeś ogólnie (i w sposób niezrozumiały) program, podałeś niezwiązany z problemem kod i czego właściwie oczekujesz? |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-02-14 19:27:30 Oczekuje zwykłej odpowiedzi. Wytłumacze jeszcze raz: Mój program robi tak: SERWER -> Sprawdz czy sa nowe polaczenia -> Jesli tak dodaj nowe polaczenie do vectora -> Petla obslugi wszystkich polaczen ^ -> Spakuj dane o aktualnym graczu | -> Wyslij dane o aktualnym graczu | -> Wyczysc paczke /\ | -> Odbierz dane od clienta | -> Wykonaj operacje na pozycji gracza (komendy) | <-> Nastepny Gracz
CLIENT -> Sprobuj polaczyc z serwerem -> Jesli polaczono to ->Wyswietl okno ->Odbierz paczke z danymi o graczu <<<<< Tu cos szwankuje, tzn zawsze jest pozycja 300, 300 (pozycja podana w konstruktorze klasy Gracza. ->Wyslij zadanie dla serwera (komende) ->Ustaw pozycje obrazka w odebranej od serwera pozycji ->Wyswietl obrazki
Edit: Po wykonaniu zadania dla odpowiedniej komendy (np idz_w_prawo) normalnie serwer pokazuje dobra pozycje. Przy wysylaniu też. Kiedy jednak ją odczytam w Cliencie to jak pisałem wyskakuje x=300, y=300 |
|
« 1 » 2 |