Как сохранить синхронизацию игры на iphone в Cocos2d (+ box2d) с gamekit - PullRequest
1 голос
/ 28 января 2011

поэтому я сделал игру box2d с cocos2d.Пользователь может перемещать игрока и в мире появляются динамические объекты.Теперь я подумал о реализации режима кооператива.

Я знаю, что есть gamekit.

Мои мысли:

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

  • если при загрузке уровня все позиции отправляются со всех объектов (статические + динамические + позиции игрока) другим клиентам (iphones / ipods / ipads) и теперь они должны быть синхронизированы

НО

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

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

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

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

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

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

Спасибо за чтение Хорошего дня.

:)

Ответы [ 2 ]

1 голос
/ 28 января 2011

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

edit: вы также должны подумать о минимизации трафика, поэтому отправка 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)];

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

1 голос
/ 28 января 2011

Да, Bluetooth - ваш единственный вариант при таких обстоятельствах.

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

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

...