Как сохранить синхронизацию игры на iphone в Cocos2d (+box2d) с gamekit?
Поэтому я сделал игру box2d с cocos2d. Пользователь может перемещать игрока и в мире появляются динамические объекты. Теперь я подумал о реализации режима кооператива.
Я знаю, что есть GameKit.
Мои мысли:
сделать одно из двух устройств (или больше..) для хоста.
если загрузка уровня отправляет все позиции из всех объектов (статические + динамические + позиции игроков) другим клиентам (iphones/ipods/ipads) и теперь это должно быть синхронизировано
НО
Должен ли я сделать dict, а затем добавить позиции всех объектов к нему, а затем преобразовать его в объект nsdata, а затем отправить его.
Этого достаточно?
Я хочу сделать это без какого-либо подключения к Интернету, так что P2P.
Я думаю, единственная возможность - Bluetooth или есть еще?
Этого достаточно?
Было бы здорово, если бы кто-то мог дать мне несколько советов и некоторый код о том, как это сделать.
Спасибо за чтение Хорошего дня.
:)
2 ответа
Я думаю, что хорошей идеей было бы сделать один из хостов сервером. Потому что, если вы создадите соединение для каждого, у вас будет 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)];
Возможно, вы хотите добавить заголовок в пакет и поместить туда количество объектов и т. Д.
Да, Bluetooth - ваш единственный вариант в этих условиях.
Что касается настройки одного устройства в качестве хоста и т. Д., Apple предоставит пример кода, который поможет вам начать работу.
По моему опыту, Bluetooth очень ненадежен, когда дело доходит до экшн-игр просто из-за проблем с производительностью, особенно когда активен Wi-Fi, который находится вне вашего контроля. Если ваша игра зависит от синхронизации игр, то я приложу все усилия, чтобы уменьшить объем данных, передаваемых через Bluetooth. Это означает, что отправка всего вашего состояния игры непрерывно, вероятно, не будет достаточно хорошей. Вы хотите синхронизировать свои игры, настроить мир на каждом устройстве, а затем отправить только данные игрока.