2011-01-28 2 views
1

поэтому я сделал box2d игру с cocos2d. Пользователь может перемещать плеер, а в мире есть динамические объекты. Теперь я думал о реализации режима курятника.Как сохранить синхронизацию игры iphone в cocos2d (+ box2d) с gamekit?

Я знаю, что есть игра.

Мои мысли:

  • сделать один из двух устройств (или более ..) к хосту.

  • если нагрузки на уровне отправить все позиции из всех объектов (статические + динамические позиции + плеер) к другим клиентам (айфонов/Ipods/IPADS), и теперь она должна быть синхронизация

НО

должен ли я сделать dict, а затем добавить позиции всех объектов к нему, а затем преобразовать его в объект nsdata, а затем отправить его.

Этого достаточно?

Я хочу сделать это без подключения к Интернету, поэтому P2P.

Единственная возможность Bluetooth я думаю или есть еще?

Этого достаточно?

Было бы здорово, если бы кто-нибудь мог дать мне совет и некоторый код о том, как это сделать.

Спасибо за чтение Имейте славный день.

:)

ответ

1

Я думаю, что хорошая идея сделала бы один из хостов сервером. Потому что, если вы создаете соединение по каждому из них, то вы будете иметь общее количество соединений N * (N-1) и (N-1) для каждого хоста. Если вы используете сервер, у вас будет только соединение N-1 для сервера и только 1 соединение для каждого клиента. Таким образом, вам нужно будет выполнить полную симуляцию на каждом из хостов, а затем синхронизировать данные с сервером. Моделирование, синхронизированное с регулярными интервалами, будет работать одинаково на всех компьютерах. Это означает, что для того, чтобы все было одинаково для всех пользователей, необходимы небольшие и нечастые корректировки.

Редактировать: вы также должны думать о минимизации трафика, поэтому отправка NSDictionary будет слишком большой.Вы можете отправить небольшую структуру, как

typedef struct { 
    short obj_id; 
    float pos; 
    float vel; 
    float angle; 
} obj_inf; 

edit2:

obj_info obj1_inf; 
//set the values here ... 
NSData* packet = [NSData dataWithBytes: &obj1_inf length: sizeof(obj_info)]; 

//if you have an array of obj info (e.g. 20 objects): 
obj_info* oinf_arr = calloc(20, sizeof(obj_info)); 
for(int i=0; i<20; ++i) [{ 
    //fill each oinf_arr[i] 
} 
NSData* packet = [NSData dataWithBytes: oinf_arr length: 20*sizeof(obj_info)]; 

Возможно, вы хотите добавить заголовок пакета и поместить там количество объектов и т.д.

+0

небольшая структура вы сделали. Как это использовать? Можете ли вы сделать очень маленький образец ... вам даже не нужно использовать гейкит в образце. Благодарю. edit: как я могу преобразовать структуру в nsdata и обратно? – cocos2dbeginner

+0

см. Редактирование. основная идея - свести к минимуму трафик. – Max

+0

Теперь я вижу. большое спасибо :) – cocos2dbeginner

1

Да, Bluetooth является единственным вариантом в этих условиях.

Что касается настройки одного устройства как хоста и т. Д., Apple предоставит sample code, который поможет вам начать работу.

По моему опыту, Bluetooth очень ненадежен, когда дело касается игр, просто из-за проблем с производительностью, особенно когда Wi-Fi активен, что не поддается контролю. Если ваша игра зависит от того, что игры очень тесно синхронизированы с точки зрения таймингов, я приложил бы все усилия для уменьшения объема данных, передаваемых через Bluetooth. Это означает, что ваше полное состояние игры постоянно постоянно, вероятно, не будет достаточно хорошим. Вы хотите синхронизировать свои игры, настроить мир на каждом устройстве, а затем отправить только вход игрока.

+0

спасибо большое за ваша помощь – cocos2dbeginner