Если вы не хотите, чтобы ваша игра была изолирована от внешнего мира, необходимо иметь внутренний сервер. Сервер предоставляет способ управления пользователями, обмена игровыми данными (рекорды, достижения и т. Д.) И обеспечения социальных взаимодействий (среди прочих). Однако создать собственный бэкэнд довольно сложно (посмотрите, например, на несколько шагов и обширную криптографическую подпись, необходимые для проверки бэкенд-вызовов в приложениях 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-уведомления, чат, аналитика и т. Д.)
Удачного кодирования!