Если вы не хотите, чтобы ваша игра была изолирована от внешнего мира, необходимо иметь внутренний сервер. Сервер предоставляет способ управления пользователями, обмена игровыми данными (рекорды, достижения и т. Д.) И обеспечения социальных взаимодействий (среди прочих). Однако создать собственный бэкэнд довольно сложно (посмотрите, например, на несколько шагов и обширную криптографическую подпись, необходимые для проверки бэкенд-вызовов в приложениях Android, как это предложил Тим Брей из Google).
К счастью, разработчики игр могут использовать такие сервисы, как Kii Cloud, которые предоставляют все, что им нужно, чтобы иметь надежный, масштабируемый игровой сервер, который работает на нескольких платформах, которые поддерживает ваша игра, и в то же время предлагает мягкую кривую обучения. Это устраняет сложность серверной реализации и позволяет вам сосредоточиться на создании своей игры.
Чтобы продемонстрировать разработчикам инди-игр ценность мобильного бэк-энда, я собираюсь предоставить серию постов в блоге, посвященных конкретным потребностям, связанным с игрой, таким как распределенное ведение рекордов, регистрация пользователей, хранение игровых данных и социальные взаимодействия. среди пользователей. В этих примерах я собираюсь использовать Android-игру с открытым исходным кодом « Frozen Bubble » (хорошая игра, изначально созданная для Linux с приличным портом Android, которая не включает в себя какие-либо бэкенд-функции).
Давайте начнем с того, как поддерживать аутентификацию Facebook и игровые настройки в «облаке» с помощью Kii SDK. Как вы, наверное, уже знаете, инициализация Kii Cloud становится тривиальной после добавления библиотеки jar в путь к классам (более подробную информацию об установке смотрите на этой странице ):
/** * Initialize KiiSDK Please change APP_ID/APP_KEY to your application */ private void initKiiCloud() { Kii.initialize( Constants.APP_ID, Constants.APP_KEY, Site.US ); }
Я уже подробно описал аутентификацию Facebook здесь, и процесс ее поддержки в Frozen Bubble ничем не отличается. В основном мы собираемся использовать заставку игры, чтобы автоматически активировать аутентификацию Facebook, что приведет к тому, что у нас будет определенный пользователь Kii для работы (если процесс аутентификации успешен). Обратите внимание, что этот процесс является регистрация + вход. При первом запуске приложения вы будете перенаправлены на страницу Facebook, где вы сможете включить приложение для входа в систему с вашим пользователем Facebook. После того, как вы согласитесь, вы больше не увидите страницу Facebook (после этого вход в систему автоматический).
Код в основном выглядит так:
/** * Facebook login */ private void facebookLogin() { Log.d(TAG, "Initializing facebook login"); KiiSocialConnect facebook = Kii.socialConnect(SocialNetwork.FACEBOOK); facebook.initialize(Constants.FB_APP_ID, null, null); facebook.logIn(this, null, new KiiSocialCallBack(){ @Override public void onLoginCompleted(SocialNetwork network, KiiUser user, Exception exception) { super.onLoginCompleted(network, user, exception); if (exception != null) { Log.d(TAG, "Facebook login exception"); return; } Log.d(TAG, "Facebook login completed"); Log.d(TAG, "User is: " + KiiUser.getCurrentUser().getUsername()); startFrozenBubble(); } }); }
Плюс строка кода, необходимая для метода действия onActivityResult () :
Kii.socialConnect(SocialNetwork.FACEBOOK).respondAuthOnActivityResult(requestCode, resultCode, data);
Чтобы упростить задачу, мы применяем аутентификацию Facebook при запуске приложения (т.е. приложение не будет работать, если вы не выполняете авторизацию через Facebook). В идеале, мы хотим, чтобы аутентификация Facebook была опцией среди других стандартных альтернатив регистрации / входа. В целом, код, необходимый для поддержки аутентификации Facebook, минимален, и все перенаправления на страницы Facebook обрабатываются автоматически (не забудьте указать разрешение INTERNET в файле манифеста Android).
Теперь перейдем к управлению данными в Kii Cloud. Подумайте об этом: в чем разница между хранением ваших игровых настроек в локальном файле стандартных настроек, а не в облаке? Вы правильно поняли, вы можете сохранять одинаковые игровые предпочтения на всех устройствах, пока пользователь остается одним и тем же . Разве не было бы неплохо позволить вашим пользователям начинать с последнего уровня, на котором они играли, даже если они переключают устройства?
Давайте посмотрим, как создать менеджер предпочтений области действия пользователя в облаке. В основном мы будем работать с одним объектом ( KiiObject ) и сохраним настройки в виде пар ключ / значение. Вы можете свободно определять свои объекты, добавляя любые пары ключ-значение, не устанавливая никаких схем и не делая дополнительных настроек. Для этого мы инкапсулируем функциональность в классе PreferencesManager, который работает с пользовательской областью KiiBucket (корзина для облачных объектов, привязанных к каждому пользователю вашего приложения). Внутри этого класса мы будем работать с объектом bucket и облачными предпочтениями:
KiiBucket userBucket = Kii.user().bucket("game_preferences"); KiiObject cloudPrefs = userBucket.object(); cloudPrefs.set("fullscreen", true); cloudPrefs.save();
Посмотрите, как просто установить пары ключ / значение в KiiObject с помощью set () ? Имейте в виду, что save () — это удаленный вызов, который блокирует / задерживает ваш поток пользовательского интерфейса, поэтому вы можете использовать асинхронную версию save (), которая использует обратный вызов. В приведенном выше фрагменте кода мы инициализируем контейнер и объект prefs, но контейнер будет создан в облаке только после вызова save () . Также обратите внимание, что мы можем вызвать Kii.user (), потому что мы аутентифицировались через Facebook, в противном случае, без зарегистрированного пользователя, вы просто не сможете запросить область действия пользователя.
Но как мы узнаем, что в облаке уже есть настройки, которые нам нужно загрузить? Для этого мы используем запрос Kii Cloud:
// Define query conditions. This is an empty "get all objects" query KiiQuery query = new KiiQuery(); query.setLimit(1); // Query the bucket for preferences object KiiQueryResult result = userBucket.query(query); List objLists = result.getResult(); for (KiiObject obj : objLists) { cloudPrefs = obj; Log.d(TAG, "Preferences found"); }
Мы просто запрашиваем объект предпочтений в корзине. У вас может быть любое количество сегментов, серверная часть Kii оптимизирована для горизонтального масштабирования — вы никогда не можете иметь слишком много сегментов, но можете иметь слишком глубокие объекты. Вот почему мы просто использовали выделенное ведро для объекта предпочтений. Мы ограничиваем результаты одним для наглядности, хотя в действительности это не является необходимым (мы используем один объект для хранения всех настроек и отбрасываем любой дубликат, если он присутствует). После того, как мы получили объект из облака, мы можем получить значения для определенных ключей:
cloudPrefs.getString(key, default); cloudPrefs.getBoolean(key, default); cloudPrefs.getInt(key, default);
Примечание. Эти методы возвращают значение по умолчанию, если ключи не найдены.
В целом, работать с менеджером настроек в Kii Cloud очень просто. Вы можете попробовать пример приложения Frozen Bubble с реализацией PreferencesManager, которую вы можете использовать в своем собственном приложении. Один совет: в примере используются синхронизирующие вызовы к облачному сервису, из-за которых игра теряет некоторые кадры. Несмотря на то, что это не заметно, я настоятельно советую вам использовать асинхронные версии этих методов (например, save () ), которые возвращаются автоматически и используют обратный вызов, чтобы сообщить вам, что произошло, или дать вам результаты.
Если вы хотите углубиться в управление данными с помощью Kii Cloud, пожалуйста, ознакомьтесь с нашей превосходной документацией . Я буду продолжать добавлять бэкэнд-функциональность в Frozen Bubble, используя Kii Cloud, так что следите за обновлениями (например, распределенные рекорды, push-уведомления, чат, аналитика и т. Д.)
Удачного кодирования!