Мультиплеер Box2D и GameCenter

#iphone #ios #cocos2d-iphone #game-center

#iPhone #iOS #cocos2d-iphone #игровой центр

Вопрос:

у меня есть хоккейная игра с молотками, запущенная на iphone / ipad. Сервер управляет всей физикой и отправляет на другое устройство положение молотка сервера, а клиент отправляет на сервер свое положение молотка.

Эта часть работает правильно, проблема в шайбе. Потому что это слишком быстро, и сервер является тем, кто отправляет сообщение. Проблема в том, что puck является телом b2_dynamic, и сервер отправляет клиенту, где находится puck. Я обновил, чтобы отправлять позицию клиенту каждый кадр в gameLoop, но проблема в том, что она не работает должным образом. Движения молотков в порядке, но шайба немного странная, я думаю, это связано с линейной скоростью шайбы.

Что я делаю, так это:

 [gamedelegate movePuckToX:messageData->x andY:messageData->y andAngle:0.0];


- (void) sendMovePuck {
MessageMovePuckTo message;
message.message.messageType = kMessageTypeMovePuck;

float_t pX = puck->GetPosition().x;
float_t pY = puck->GetPosition().y;

message.x = pX;
message.y = pY;

NSData *data = [NSData dataWithBytes:amp;message length:sizeof(MessageMovePuckTo)];    
[self sendData:data];    
}


-(void )movePuckToX:(float_t)x andY:(float_t)y  andAngle:(float_t)ang
{
    lastPuckReceivedPosition = b2Vec2(x, [self getScreenSize].height/32 - y);
    puck->SetAwake(false);        
    puck->SetTransform(b2Vec2(x, [self getScreenSize].height/32 - y), 0);           
    puck->SetLinearVelocity(b2Vec2(0,0));
}
  

Что лучше всего отправлять клиенту положение шайбы? Есть идеи или идеи? Мне не удалось решить эту проблему: (

Комментарии:

1. Просто быстрая мысль, не следует ли вместо этого вычислить физику на клиенте? И просто позволить серверу отправлять силу, которая была установлена на шайбу?

2. я согласен с приведенными выше комментариями. Особенность клиентского сервера в том, что вы должны отправлять клиентам как можно меньше данных. Вычисления должны выполняться на стороне клиента.

Ответ №1:

Вы должны попробовать использовать dead reckoning и рассчитать его для каждой стороны. Используйте хост только для распространения последней игры.

В навигации подсчет времени — это процесс вычисления текущей позиции пользователя с использованием ранее определенной позиции или исправления и продвижения этой позиции на основе известных или расчетных скоростей за прошедшее время и курса.

http://en.wikipedia.org/wiki/Dead_reckoning