WinSock palīdzība

Vieta, kur parunāt par to, kas nav atsevišķi izdalīts augstāk
Message
Author
CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: WinSock palīdzība

#31 Post by CodeWolf » 06 Nov 2011, 12:32

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]);

	}
	}
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: WinSock palīdzība

#32 Post by bubu » 06 Nov 2011, 14:30

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);
        }
    }
}

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: WinSock palīdzība

#33 Post by CodeWolf » 07 Nov 2011, 01:01

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++).... :?
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: WinSock palīdzība

#34 Post by bubu » 07 Nov 2011, 12:36

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;
}

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: WinSock palīdzība

#35 Post by CodeWolf » 08 Nov 2011, 18:44

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);
}
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: WinSock palīdzība

#36 Post by bubu » 08 Nov 2011, 18:47

Un kas šajā koda gabalā tieši tev nestrādā? Kura rindiņa?

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: WinSock palīdzība

#37 Post by CodeWolf » 08 Nov 2011, 19:19

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]); :/
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: WinSock palīdzība

#38 Post by bubu » 08 Nov 2011, 21:25

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

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: WinSock palīdzība

#39 Post by CodeWolf » 08 Nov 2011, 21:59

: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 :?
//OpenGL

Post Reply

Return to “Programmēšana / Programming”