Статьи

Использование MBaaS в мобильной игре (часть 1): менеджер настроек в облаке

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

Удачного кодирования!