if(ServerSocket1->Active==true)
for(int i=0;i<100;i++)
ServerSocket1->Socket->Connections[0]->SendBuf(&CreaturePos[1],sizeof(TPoint));
else
for(int i=0;i<100;i++)
ClientSocket1->Socket->SendBuf(&CreaturePos[1],sizeof(TPoint));
Сервек - Клиент
Код:
В итоге при передвижении обьектов в клиенте , на сервере они двигаются оставляя за собой следы....тоесть , допустим передвигается точка..при передвижении она оставляет за собой свои изображения которые пропадают со временем. Что это может быть ? Может нужно както чистить буффер ? Или что ?
Отправка происходит каждые 10 мс.
Цитата: Frio
В итоге при передвижении обьектов в клиенте , на сервере они двигаются оставляя за собой следы....тоесть , допустим передвигается точка..при передвижении она оставляет за собой свои изображения которые пропадают со временем. Что это может быть ? Может нужно както чистить буффер ? Или что ?
В смысле, оставляют за собой изображение? На сервере отрисовка идет или что? Можно еще на этот код взглянуть? Пробывал смотерть значения точек своих животных в отладчике?
А глянуть на исходники клиента можно или это сакральная тайна?
какая точка? какое изображение? какие следы? кто все эти люди? при чем тут клиент-сервер?
Код:
if(Player==1) Game->Canvas->Pen->Color=RGB(255,0,0); else Game->Canvas->Pen->Color=RGB(0,0,255);
Game->Canvas->Ellipse(CreaturePos[1].x,CreaturePos[1].y,CreaturePos[1].x-4,CreaturePos[1].y-4);
if(Player==2) Game->Canvas->Pen->Color=RGB(255,0,0); else Game->Canvas->Pen->Color=RGB(0,0,255);
Game->Canvas->Ellipse(CreaturePos[2].x,CreaturePos[2].y,CreaturePos[2].x-4,CreaturePos[2].y-4); }
Game->Canvas->Ellipse(CreaturePos[1].x,CreaturePos[1].y,CreaturePos[1].x-4,CreaturePos[1].y-4);
if(Player==2) Game->Canvas->Pen->Color=RGB(255,0,0); else Game->Canvas->Pen->Color=RGB(0,0,255);
Game->Canvas->Ellipse(CreaturePos[2].x,CreaturePos[2].y,CreaturePos[2].x-4,CreaturePos[2].y-4); }
if(Player==1) - если мы сервер if(Player==2) - если мы клиент
CreaturePos[1] - координаты ваших точек
CreaturePos[2] - координаты того кто на другой стороне коннекта
Вот передача
Код:
if(ServerSocket1->Active==true){
if(ServerSocket1->Socket->ActiveConnections>0)
for(int i=0;i<100;i++)
if(CreaturePos[1].x>-30)
ServerSocket1->Socket->Connections[0]->SendBuf(&CreaturePos[1],sizeof(TPoint)); }
else
for(int i=0;i<100;i++)
if(CreaturePos[1].x>-30)
ClientSocket1->Socket->SendBuf(&CreaturePos[1],sizeof(TPoint));
if(ServerSocket1->Socket->ActiveConnections>0)
for(int i=0;i<100;i++)
if(CreaturePos[1].x>-30)
ServerSocket1->Socket->Connections[0]->SendBuf(&CreaturePos[1],sizeof(TPoint)); }
else
for(int i=0;i<100;i++)
if(CreaturePos[1].x>-30)
ClientSocket1->Socket->SendBuf(&CreaturePos[1],sizeof(TPoint));
Вот приём
Код:
void __fastcall TGamePoints::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
for(int i=1;i<100;i++)
Socket->ReceiveBuf(&CreaturePos[2],sizeof(TPoint));
}
//---------------------------------------------------------------------------
void __fastcall TGamePoints::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
for(int i=1;i<100;i++)
Socket->ReceiveBuf(&CreaturePos[2],sizeof(TPoint));
}
TCustomWinSocket *Socket)
{
for(int i=1;i<100;i++)
Socket->ReceiveBuf(&CreaturePos[2],sizeof(TPoint));
}
//---------------------------------------------------------------------------
void __fastcall TGamePoints::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
for(int i=1;i<100;i++)
Socket->ReceiveBuf(&CreaturePos[2],sizeof(TPoint));
}
Оставляет следы в смысле......Если что-нибудь выделить в паинте , зажать shift и потянуть быстро....Вот, точнее описать не могу.
да, и 10мс. вряд ли от винды можно добиться
Я просто не имею ни малейшего представления что можно поменять в прорисовке что бы такого не было. Там вроде и так легче некуда да и свиду проблем не должно возникать =\
Поставь таймер где-то 100-500 мс. или работай со временем на низком уровне через АПИ непосредственно в цикле программы.
Если бы я ещё знал что за АПИ......100-500 мс врядли подойдёт.....потому что оно должно происходить как бэ в реальном времени а не раз в пол секунды.
Цитата:
Если бы я ещё знал что за АПИ......100-500 мс врядли подойдёт.....потому что оно должно происходить как бэ в реальном времени а не раз в пол секунды.
GetTickCount, например. Возвращает количество тиков после старта системы.
Тоесть я так понял делать не по таймеру а по беконечному циклу ? И не совсем понял что значит с проверкой на время ? Можешь немного подробнее описать ? 17 лет я ещё не так быстро схватываю наверное (
Организация приложения Windows
Почитай о структуре приложения, поможет пониманию дела.
Проблема в Билдере в том, что нам сложно влезать в цикл приложения, поэтому придется делать свой искуственно, а там уже творить свои темные дела.:rolleyes:
А проверка на время - это проверка на время. Смотрим старое время, смотрим новое. Если не прошел положенный срок, то повисим в бесконечном цикле, например.
Почитай о структуре приложения, поможет пониманию дела.
Проблема в Билдере в том, что нам сложно влезать в цикл приложения, поэтому придется делать свой искуственно, а там уже творить свои темные дела.:rolleyes:
А проверка на время - это проверка на время. Смотрим старое время, смотрим новое. Если не прошел положенный срок, то повисим в бесконечном цикле, например.
Я немного не об этом.....Я к тому , как мне может помочь бесконечный цикл с отслеживанием времени ?....Что мне вообщем это даёт ?
Загляни по ссылке и внимательно прочитай :)
Всё равно не понимаю как оно может помочь решить мою проблему (
Цитата: Frio
Всё равно не понимаю как оно может помочь решить мою проблему (
Что мешает в цикле сверять текущее время и время прошлого события?
В простейшем случае выглядеть будет примерно так
Код:
#include <iostream>
#include <time.h>
void printdt(clock_t dt)
{
std::cout << dt << std::endl;
}
int main(int argc, char* argv[])
{
clock_t needed_dtime = CLOCKS_PER_SEC / 10; //100 ms
clock_t t = clock();
for(;;){
clock_t dt = clock() - t;
if(dt > needed_dtime){
printdt(dt);
t = clock();
}
}
return 0;
}
#include <time.h>
void printdt(clock_t dt)
{
std::cout << dt << std::endl;
}
int main(int argc, char* argv[])
{
clock_t needed_dtime = CLOCKS_PER_SEC / 10; //100 ms
clock_t t = clock();
for(;;){
clock_t dt = clock() - t;
if(dt > needed_dtime){
printdt(dt);
t = clock();
}
}
return 0;
}
http://cplusplus.com/reference/clibrary/ctime/clock/
Может ли помочь winsock2 ?? Щас начал читать...