2011-09-29 127 views
0

我有一個在iphone/ipad上運行的木槌遊戲。服務器控制所有的物理過程,並向另一個設備發送服務器木槌位置,客戶端將他的木槌位置發送給服務器。Box2D和GameCenter多人遊戲

這部分工作正常,問題是關於冰球。因爲速度太快,服務器就是發送消息的開始。問題是冰球是一個b2_dynamic主體,服務器發送給冰球所在的客戶端。我已經更新了在gameLoop上的每一幀發送位置給客戶端,但問題在於流程不正常。木槌的動作沒問題,但是冰球有點奇怪,我認爲冰球的線速度已經到了。

什麼Im做是這樣的:

[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:&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)); 
} 

最新最好的發送圓盤位置給客戶的?任何想法或見解?我不能設法解決這個:(

+0

只是一個快速的想法,你不應該計算客戶端上的物理?只要讓服務器發出已經設置在冰球上的力量? – Mikael

+0

我同意上述意見。關於服務器客戶端的一點是,您應該儘可能少地向客戶端發送數據。計算應該在客戶端完成。 – xuanweng

回答

0

你應該嘗試使用航位推算和計算它在每邊。 使用主機只是最後打分發。

在導航,航位推測是過程通過使用先前確定的位置,或固定,和推進基於已知的或估計的速度超過經過時間,當然該位置計算一個當前位置。

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