Pull to refresh

Comments 45

Пчелы круглые, упитанные. Значит вкусный мед ) Интересно, может ли человек понимающий как должно быть, используя эти интсрументы «написать» простую игру под iOS?
Определенно считаю, что может :)
На сколько сложно было Game Center подключать? Как вы сохраняете in game values and entity status — звук, уровни, деньги?
Game Center сам по себе подключается легко, если к примеру нужно создать лидерборд. Другое дело, что архитектура стала сложнее из-за того, что нужно было закладывать мультиплеер.
К примеру, нужно было отделить алгоритм генерации карты от кода, который добавляет объекты на сцену. Во-вторых, игра работает в двух режимах — в синглплеере игра сама генерирует для себя уровень. А в мультиплеере еще более сложно — один из игроков клиент, второй сервер. Т.к. писать много кода не хотелось, то сразу продумал, как должны выглядеть объекты. В общем, это была скорее архитектурная задача.
Спасибо, учто. У меня те же проблемы поэтому и хотел узнать. Я спрашивал еще про сохранение выше — я видел игры которые к Game Center данные приурочивают — может знаете как? Потому-что пока я с NSUserDefaults сохраняю.
Здесь два подхода — сохранять в iCloud, что будет почти эквивалентно к привезке к Game Center, т.к. user id у них один и тот же, за исключением, если юзер почему-то специально решил зайти в геймцентр под еще каким-нибудь аккаунтом.
А второй вариант — синхронизировать со своим сервером после авторизации пользователя. Этот вариант почти эквивалентен предыдущему за тем лишь исключением, что нужно еще самому писать синхронизацию.
Свой sync писать я побаиваюсь да и денег на сервер нет. Может потом. Да но не все ведь используют iCloud (у меня к примеру отключен) — да я видел в Clash of Clans что в зависимости с каким ты AppleID зашел в GameCenter, она может данную игру приурочить к этому AppleID или если уже игра имеется, подгрузить данные.
Они легко подписывают на своем сервере твои данные под твой id, ведь он уникальный и им не нужно изобретать новые.
Да, в этом плане логично просто.
Кстати если игра синглплеерная- лучше глобальные сохранения хранить в iCloud'e, потому что его проще использовать в плане синхронизации(подгружать достаточно один или более раз при переустановки приложения.).
В случае же Game Center данные загружаются при каждом входе и если нет интернета, само собой данные не получишь.
Данные для iCloud'a достаточно хранить в папке документы для синхронизации, например внутри бинарного файла или плиста.
Да игра синглплеерная. Спасибо, завтра с утра покапаю.
Я делал нечто похожее. Если я правильно вас понял, вы не хотите хранить все очки, достижения и прочее в NSUserDefaults, а хотите их брать напрямую из Game Center? Тогда вам нужны loadAchievementsWithCompletionHandler: и loadLeaderboardsWithCompletionHandler: в комбинации с loadScoresWithCompletionHandler:.

Но все равно придется хранить все локально. На случай если нет интернета, нужно же хоть что-то показать пользователю, хотя бы данные на момент прошлого запуска. Другая проблема — если при попытке обновить лидерборд или ачивки ничего не получится, тогда часть прогресса игрока просто потеряется. Нужно добавлять механизм, вроде кеширования, если не отправились данные, сохранить их локально и попробовать отправить когда игра снова будет онлайн.
Я вас благодарю — да это именно что я искал. Про локал и кеш это логично — просто не хочеться как раньше что начал Angry Birds на одном девайсе а потом взял другой и с нулю надо. На сколько помню тут надо быть еще аккуратным с частотой проверки на наличие интернета — кажеться Dace Rally проверяло слишком часто и у меня батарейка в ноль уходила очень быстро.
А у меня вопрос по оптимизации мультиплеера. Я уже писал свой раньше через GameCenter и пробовал архитектуры с моделями, как клиент-клиент так и клиент- сервер. Но никак не мог избавиться от асинхронности.
Вопрос вот в чем: какие пакеты и с каким содержимым вы пересылаете по сети?
> Но никак не мог избавиться от асинхронности.
Возможно не понял, что вы имеете ввиду, но вообще асинхронность — это скорее плюс, чем минус.
Честно говоря, модель взаимодействия самая простейшая — пересылаются сериализованые NSDictionary. От лености и потому, что сообщения легкие, мог бы использовать JSON, но решил, что дикты напрямую будет проще.
Хотя для одной игры писал фрейминг, похожий на этот — http://rfc.zeromq.org/spec:15, но не для этой
Да я неправильно выразился: в ходе экспериментов я пересылал данные как синхронно так и асинхронно, но асинхронность не дает гарантий получения данных вовремя.
Для наглядности: суть моей игры- два человека управляют самолетиками и устраивают перестрелки.
Испробованные варианты содержания пакетов: NSDictionary и специально определенные пакеты через typedef. Второе кстати работает быстрее и лучше.
Пробовал передавать:
-сигналы о нажатии кнопки(то есть сигнал передан- самолет повернулся либо выстрелил)
-координаты самолетов

Через минуту наблюдалось смещение позиции самолетов на девайсах: то есть на одном он в одних координатах, на другом в других. При этом все работало плавно. Если же отправлял координаты — самолеты дергались, т.к подстраивались под полученные координаты.

Отсюда вопрос: Как поступили вы и какими способами отправляли пакеты?
Пакеты отправлял асинхронно стандартным механизмом геймцентра. Собственно, плавающее латенси есть и у меня, да и вообще это неизбежная ситуация при работе с сетью.
Я решил проблему тем, что просто сгладил дергания персонажа — когда приходит апдейт о положении, я не мгновенно отправлял его на новую координату, а делал action, который перемещал его туда за пол секунды. Учитывая, что все это время фон движется равномерно, то такое движение выглядит хорошо.
Но для стрелялок требования будут более сильными.
Для самолетов я порекоммендую комбинированый вариант — передавать и координату по таймеру и данные о нажатии, когда оно произошло. Зная, куда движется самолет, отображать его движение action-ом, а когда приходит поправка, корректировать траекторию так, чтобы учесть поправку. Нажатие обрабатывать схожим образом, только еще менять траекторию.
А вообще, это такая задача, где чем-то придется пожертвовать — либо точностью игры (задержка по сети, снаряд якобы попадает в самолет, но в реальности он улетел, но и игра показыват, что попал), либо плавностью (все действия обсчитываются на сервере, а игрок только отправляет сигналы об управлении, но тогда он будет наблюдать подтормаживания во всей красе. Именно по этому, кстати, так много игр с эльфами, где точность выстрела не играет роли и так мало хороших шутеров).
Фокус с action'ами тоже проделывал, но помогло мало. Спасибо за ответ в будущем буду пробовать еще. Меня навело на мысль что сам gamecenter плохо настроен, может попробовать какие-нибудь другие инструменты.
С шутерами заметил особенность, что их пишут практически всегда в юнити, там и альтернативы gamecentr'у есть.
По-моему у вас была проблема в том что движок вашей игры не был полностью детерминированным.
Представьте себе ситуацию — оба самолета летят ровно, угол 0 градусов.
Первый игрок нажимает поворот. Клиент первого игрока поворачивает самолет вверх и шлет сигал второму повернуть.
Второй тоже повернет первый самолет вверх, но в движке второго — первый самолет успеет пролететь чуть дальше, чем он реально пролетел прежде чем повернул ( скорость доставки этого сетевого сообщения ).
Ну а дальше это начинает применятся ко всем действиям — разница в двух моделях накапливается…
Чтобы этого избежать — все действия должны совершаться не в момент совершения их клиентом, а в момент когда сервер сообщит нам о них ( даже если это наше собственное действие ).
Для надежности я считаю что сервер должен слать всем клиентам действия вместе с текущим тиком игры, и тогда клиент точно сможет выполнить нужное действие в нужный тик ( и даже при необходимости откатиться на несколько действий назад ).
Это несомненно так, вы говорите все верно. Но даже если использовать сервер, а можно обойтись и без него- ведь можно отслеживать, дошло ли сообщение, например, все равно все это сводится к тому, что задержка будет наблюдаться в процессе отдачи приказа даже с того же сервера обратно на клиент.
Слать через тик может быть накладно, т.к. это большое количество раз в секунду. Я уже пробовал так делать- получалось либо слать синхронно- тогда пакеты медленно доходят, либо асинхронно и тогда они могут потеряться либо прийти не по порядку.
Даже если при генерации уровней используется random, все равно можно их синхронизировать. При начале игры один игрок генерирует seed и делится с другим. В результате получается такая себе квантовая запутанность, у обоих игроков random выдает одни и те же результаты, это, конечно, если количество и последовательность random одинакова у обоих клиентов и не зависит от каких-то дополнительных случайных факторов.

У меня, например, была колода карт и нужно ее случайным образом перемешать у всех игроков в мультиплеере, и чтобы был один и тот же результат. Выдал всем один seed, «посеял» его в srand и отпала необходимость передавать всю колоду от сервера клиентам.
Просто, как все гениальное. Как миниум можно написать свой механизм рандома, чтобы быть уверенным, что работает одинаково.
Хотя с другой стороны, не получится обновить алгоритм генерации карты.
Да, не подумал немного о том, что рандом может быть по-разному реализован, ну чисто в теории на разных ОС может по умолчанию использоваться разный алгоритм. Если все это дело кросс-платформенное, нужно убедиться что у всех одна и та же реализация, если где-то есть разница, найти подходящую библиотеку.
мелкософтовский rand() — 1 строка на С. Я его использую везде от PHP до JS для генерации одинаковых раскладов.
Умоляю, указывайте где-нибудь в начале, что это именно cocos2d-iphone! Ведь веток cocos2d — куча, на разных языках и для разных платформ:
  • cocos2d — движок на Python для десктопных осей
  • cocos2d-iphone — движок на ObjC для iOS
  • cocos2d-x — движок на C++ для десктопных и мобильных осей, с биндингами на lua (cocos2d-lua) и Javascript (cocos2d-js)
  • cocos2d-html5 — движок на HTML5+Javascript
  • cocos2d-x for WP8 / Windows 8 — движок на C++ для новых платформ Microsoft, с использованием DirectX 11
  • cocos2d-x-xna — движок на C# с использованием библиотеки XNA, для Windows Phone 7

  • Так что если вы указываете просто cocos2d, то получается, что вы пишите на Python :-) Заходит человек поинтересоваться, а тут совсем не то, что он ожидал увидеть!
Так ведь указано, прямо в заголовке статьи: «iOS».
Из вашего списка остается только cocos2d-iphone или cocos2d-x (последнее — с натяжкой), но уж точно не Python.
cocos2d-x и cocos2d-html5 вполне могут быть применены к разработке для iOS. И хоть у них схожий дизайн, но отличий все равно хватает. Разве сложно указать ветку движка в аннотации?
Легко. В принципе, новичку действительно может быть неочевидно.
Расскажите пожалуйста сколько ушло времени у вас на этот проект? Команда, как я понял из статьи, два человека (вы и дизайнер)?

Попробовав два движка физики (Chipmunk и Box2D) какие различия между ними вы заметили и какой из них вы планируете использовать дальше?
Чистого времени ушло где-то месяц, но от момента старта до релиза ушло, наверное, месяцев 4-5.
Команда да, именно такая.
Что касается Chipmunk и Box2D, то разницы между ними практически никакой (не в плане API, а в плане возможностей), хотя последний более конфигурабельный.
Дальше я хочу попробовать какой-нибудь движок на Луа, поэтому буду использовать тот, который будет. Скорее всего это будет именно Box2D, как более распространенный.
UFO just landed and posted this here
Ну во-первых, у движка есть возможность создавать объекты сложной формы. Во-вторых, движок проводит оптимизацию проверки на столкновение — сначала он разбивает мир на довольно крупную сетку и проверяет столкновения внутри ячеек.
Получается, что если реализовывать этот функционал с нуля, то в итоге получится полноценный движок, так что зачем изобретать велосипед?
Ну и самое главное, движок довольно удобен в использовании — ничего в нем нет сложного.
UFO just landed and posted this here
простите, названием топика навеяло
image
Это выбор дизайнера, оставте, даже интересно и забавно — обкуренная пчела после ночи гуляний и 6 чашек кофе вышадшая на работу которая умудряется лететь прямо; то что она видет слоника с шариками, фиолетового и зеленого паука, комбо самолеты, дирижабли и шары то это значит что не все так плохо)
Не знаю, смотрели ли вы игру, но в ней действительно есть два персонажа, которые иначе, как обкуренными не назовешь:

Смотрел — про пчелу с ямайки можно просто на 100% быть уверенным что она маки опыляла =)

habrastorage.org/storage2/280/12d/7eb/28012d7eb687a389779b7271e0955265.png

Графика просто шедевр, в моей игре мне очень далеко до этого, так что снимаю шляпу)
Nepherhotep, а как со встроенными покупками? Покупали и, если да, то примерно, в какие «доходы» это вылилось?
Очень интересно, как народ реагирует на подобные инапы.
Покупает примерно 1-2% пользователей (по крайней мере, для игр такого жанра), дальше все упирается в их количество. Т.е. без массовости игры, ловить там нечего.
А можно, примерно хотя бы, услышать сумму (или просто — от N и выше), которую пользователи затратили на покупки в данном приложении?
Sign up to leave a comment.

Articles