Page 4 of 4

Re: WinSock palīdzība

Posted: 06 Nov 2011, 12:32
by CodeWolf
hmm , kāds man var izpalīdzēt ar pozicijam? jo reali nesaprotu ka viņas ir jāsaņem no katra klienta ta lai pieeja sutit koardinatas butu visiem nevis tikai pedejm..
meiģināju ar for funkciju bet liekas ka kautko ne ta saliku. :|

Code: Select all

for(int i=0;i<Clients;i++)
	{//c_p_i
	
	char _buffer[100];
	int size = sizeof(_buffer);
	_recive(i,_buffer,size);
	char*p= _buffer;
	if(*p++==3)
	{
		memcpy(&_player_pos_x[i],p,sizeof(_player_pos_x[i])); p += sizeof(_player_pos_x[i]);
		memcpy(&_player_pos_y[i],p,sizeof(_player_pos_y[i])); p += sizeof(_player_pos_y[i]);

	}
	}

Re: WinSock palīdzība

Posted: 06 Nov 2011, 14:30
by bubu
Ko tu īsti tur centies panākt? Tu ļoti neskaidri izsakies.
Ja tu vienkārši gribi aizsūtīt no servera visiem klientiem jauno spēlētāja pozīciju kad tāda pienāk serverim tad tā arī raksti:

Pseidokodā:

Code: Select all

while (servers.IrDzīvs())
{
    ziņojums = serveris.SaņemtBuferiNoKlienta();
    if (ziņojums.tips == jauna_pozīcija)
    {
        foreach (klients in visi_klienti)
        {
            if (ziņojums.klients != klients)
            {
                klients.sūtit(ziņojums);
            }
        }
    }
}
Tas nebūs pārāk efektīvi, bet strādās.

Efektīvāk būtu sūtīt pozīcijas tikai tad, ja tās patiešām mainījušās (izmaiņa ir lielāka par kautkādu epsilonu), un ne pārāk bieži, teiksim tikai 5 reizes sekundē.

Pseidokodā:

Code: Select all

laiks = 0

while (servers.IrDzīvs())
{
    ziņojums = serveris.SaņemtBuferiNoKlienta();
    if (ziņojums.tips == jauna_pozīcija)
    {
        visi_klienti.pozīcija = ziņojums.pozīcija;
    }

    tagad_laiks = nolasīt_patreizējo_laiku_milisekundēs();
    if (jauns_laiks - laiks > 1000 / 5)
    {
        laiks = jauns_laiks;

        buferis = JaunsBuferis(ZiņojumaTips.PozīcijasIzmaiņas);
        foreach (klients in visi_klienti)
        {
            if (abs(klients.pozīcija - klients.vecā_pozīcija) > epsilon)
            {
                buferis.PieliktPozīciju(klients.id, klients.pozīcija);
                klients.vecā_pozīcija = klients.pozīcija;
            }
        }
        foreach (klients in visi_klienti)
        {
            klients.Sūtīt(buferis);
        }
    }
}

Re: WinSock palīdzība

Posted: 07 Nov 2011, 01:01
by CodeWolf
hmm ,biju domājis nevis to kā izdalīt iegūtos datus bet gan to kā saņemt patstāvīgi no klientiem kuri ir pieslēgušies serverim.
tā lai piemeram servera konsole butu redzamas speletāju pozicijas...
ja Klients (ar ID =1) piespiež kadu taustiņu tad pozicija tiek nosutita un attēlota..
ja pieslēdzas klients (ar ID=2) neatņemot pirmajam sutīšanas un saņemšanas statusu piespiež kādu no taustiņiem un nosuta pozīciju tad attiecīgi konsole tiek attelotas (klienta ar id =2) izmaiņas nemainot iepriekšejā klienta poziciju..
+ ja nemaldos tad iekš c++ nav funkcijas foreach un in
ta vieta var izmantot for(int i=0; i<...;i++).... :?

Re: WinSock palīdzība

Posted: 07 Nov 2011, 12:36
by bubu
Tas ir pseidokods, nevis C++. Raksti ciklu tā, kā tev tas to ļauj - vai nu ar int i un i++, vai arī ar begin() end() C++ STL iteratoriem.

C++11 btw ir foreach:

Code: Select all

int my_array[5] = {1, 2, 3, 4, 5};
for (int &x : my_array) {
    x *= 2;
}

Re: WinSock palīdzība

Posted: 08 Nov 2011, 18:44
by CodeWolf
C++11 btw ir foreach:
nu es teicu ja nemaldos.. nebiju isti parliecinats..jo plašāk foreach(...in..) izmantoja C#....
Raksti ciklu tā, kā tev tas to ļauj - vai nu ar int i un i++, vai arī ar begin() end() C++ STL iteratoriem.
Nu es jau meiģināju..
bet nevaru iegūt attiecigo speletaju(ID) pozicijas...

Code: Select all

void _clients_pos(int value)
{
	for(c_p_i;c_p_i<100;c_p_i++) //CPI = Clients(jeb klienntu skaits kas tiek papildināts katrureizi kad pieslēdzas kāds klients.. )
	{
	
	char _buffer[100];
	int size = sizeof(_buffer);
	_recive(Clients,_buffer,size);
	char*p= _buffer;
	if(*p++==3)
	{
		memcpy(&_player_pos_x[c_p_i],p,sizeof(_player_pos_x[c_p_i])); p += sizeof(_player_pos_x[c_p_i]);
		memcpy(&_player_pos_y[c_p_i],p,sizeof(_player_pos_y[c_p_i])); p += sizeof(_player_pos_y[c_p_i]);

	}
	}
	glutTimerFunc(500,_clients_pos,value);
}

Re: WinSock palīdzība

Posted: 08 Nov 2011, 18:47
by bubu
Un kas šajā koda gabalā tieši tev nestrādā? Kura rindiņa?

Re: WinSock palīdzība

Posted: 08 Nov 2011, 19:19
by CodeWolf
Precizi nevaru pateikt , itka liekas ka strada ..+ errorus nemet
bet sūtot klienta poziciju serverim saņemto tas neuzrada jaunieguto poziciju attieciajam ID
printf(" X:%f | Y: %f \n",_player_pos_x[0],_player_pos_y[0]); :/

Re: WinSock palīdzība

Posted: 08 Nov 2011, 21:25
by bubu
Ja tu pats nezini, kas nestrādā, tad neviens tev to no melnā cauruma neizzīlēs.
Pseidokodā augstāk tev jau rakstīju kā, vienkāršotam serverim, tas viss jāraksta. Neredzot pilnībā visu kodu neviens cits tev nepalīdzēs. Tikai kristāla bumba:
Image

Re: WinSock palīdzība

Posted: 08 Nov 2011, 21:59
by CodeWolf
:D iztiksim bez kristāla bumbas ... nuu es atradu 1 vieta kļūdu + nedaudz pamainiju kodu tgd viss sūtas (: bet viennigi baigi ielago visa ta padarīšana reali aizsuti datus un serveri tie parādās .. ~ pēc kadam 5 sek ,lai gan taimeris ir uzlikts uz pussekundi jeb 500ms
liekas ka ta for funkcija iebremzē...
itka visu pareizi saliku

Code: Select all

for(int i= 0; i<=Clients;i++) 
	{//c_p_i
saņemšanas daudzums atkarīgs no klientu daudzuma taka pa virsu lieki nekas netiek skaitits klat :?