14 января 2012 в 14:46

Интеграция некоторых возможностей социальной игровой сети Scoreloop в приложение на Android

Таблицы рекордов появились в играх много-много лет назад. Сначала они были очень простыми, вспомним, например, игры для приставок с трехсимвольными именами игроков.

Со временем таблицы рекордов усложнялись, результаты стало возможно публиковать в интернете чтобы увидеть себя в глобальном списке.

В наши дни, во времена интернета, социальных сетей и мобильных устройств, таблицы рекордов выросли в целые социальные игровые сети.

Ниже я расскажу про интеграцию в свое Android-приложение одной из таких социальных игровых сетей под названием Scoreloop.

Основные возможности


Scoreloop предоставляет SDK для приложений на Android, Bada, iOS and Windows Phone 7, открывая доступ к следующим возможностям:
  • Очки и таблицы результатов. Игрок может набирать в процессе игры очки, которые отправляются на сервер и могут быть затем показаны как глобальная таблица, лучшие очки за сутки, таблица на основе национальности, на основе географического местоположения или таблица среди друзей игрока.
  • Поединки. Игрок может вызвать другого игрока на поединок: первый соревнующийся, набрав определенное количество очков, отправляет результат на сервер, установив награду за поединок (определенное количество денег во внутриигровой валюте). Другой человек может принять вызов и попытаться побить этот результат. Победивший получает награду.
  • Награды и достижения. Игрок может получать награды во внутриигровой валюте за определенные достижения (найти и убить всех монстров на уровне, пройти уровень не убив ни одного монстра и т.д.)
  • Социальные сообщения. Игрок может отсылать сообщения по электронной почте, в MySpace, Facebook и Twitter об определенных событиях, таких как получение определенного количества очков, создание поединка, победа в поединке, получение награды, информация об игре или приглашение присоединиться к Scoreloop.
  • Активности. Игрок может получать сообщения о событиях, произошедших у его друзей, или у какого-либо игрока, проходящего тот же уровень, что и он. Например: «Игрок001 получил 50 очков в игре SLDemoCore».
  • Новости. Разработчик может показывать новости напрямую игроку внутри игры.
В нашей игре мы попытаемся интегрировать очки и таблицу лучших результатов (Leaderboard в терминах Scoreloop).

Таблица результатов


Шаг 1. Регистрируемся на сайте developer.scoreloop.com (без этого ничего не получится) и скачиваем SDK (ссылка работает только если вы залогинены)

Шаг 2. Добавляем наше приложение, получаем для него game id и секретный код.

Дальше можно пойти двумя путями — использовать CoreSocial SDK и делать все руками или воспользоваться ScoreloopUI и получить готовый UI для таблицы результатов и т.д. Мы пойдем вторым путем.

Шаг 3. Разархивируем SDK в какой-нибудь каталог.

Я предполагаю, что вы используете Eclipse для разработки вашего приложения. Открываем проект ScoreloopUI из состава SDK с помощью команды File -> Import -> Existing Projects Into Workspace.

Затем подключите проект ScoreloopUI к вашему проекту как библиотеку (нажмите правой кнопкой на проекте вашей игры, выберите 'Properties', выберите 'Android', нажмите кнопку 'Add' в секции 'Library', найдите проект ScoreloopUI и выберите его).

Также необходимо подключить библиотеку scoreloop-core.jar к вашему проекту (Project -> Properties -> Libraries -> Add external JAR)

Шаг 4. Выставьте для вашего приложения необходимые разрешения.

<!-- Permission configuration required by Scoreloop -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

Очевидно, что приложению будет необходим доступ к интернету (INTERNET). Для чего нужно READ_PHONE_STATE я точно не знаю, а READ_CONTACTS можно не указывать, если выставите ui.feature.address_book = false в файле scoreloop.properties.

Шаг 5. Укажите ScoreloopUI активити, которые будет использовать ваше приложение.

<!-- Defining the ScoreloopUI activities -->
<activity android:name="com.scoreloop.client.android.ui.EntryScreenActivity" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"/>
<activity android:name="com.scoreloop.client.android.ui.ShowResultOverlayActivity" android:theme="@style/sl_dialog"/>
<activity android:name="com.scoreloop.client.android.ui.component.market.MarketHeaderActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.market.MarketListActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.entry.EntryListActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.post.PostOverlayActivity" android:theme="@style/sl_dialog"/>
<activity android:name="com.scoreloop.client.android.ui.component.score.ScoreHeaderActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.score.ScoreListActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.user.UserAddBuddyListActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.user.UserHeaderActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.user.UserDetailListActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.user.UserListActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.game.GameDetailHeaderActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.game.GameDetailListActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.game.GameListActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.profile.ProfileSettingsListActivity"/>
<activity android:name="com.scoreloop.client.android.ui.component.profile.ProfileSettingsPictureListActivity"/>
<activity android:name="com.scoreloop.client.android.ui.LeaderboardsScreenActivity" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"/>
<activity android:name="com.scoreloop.client.android.ui.framework.ScreenActivity" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"/>
<activity android:name="com.scoreloop.client.android.ui.framework.TabsActivity"/>

Шаг 6. Получение файла scoreloop.properties

Вернитесь в веб-панель scoreloop.com, настройте свойства игры (вкладка Game Properties), после этого кликните на ссылку “Get scoreloop.properties” на той же странице и сохраните файл scoreloop.properties в папку /assets вашего проекта.

Шаг 7. Инициализация и уничтожение фреймворка Scoreloop

Для инициализации и уничтожения классов фреймворка используется класс ScoreloopManagerSingleton. Обратите внимание, что операции, описанные ниже, нужно производить в классе приложения, а не активити. Когда создадите класс приложения (если у вас его еще нет), не забудьте указать имя класса приложения в теге «application» вашего манифеста.

Инициализация:

ScoreloopManagerSingleton.init(this"секретный код, полученный через веб-интерфейс");

Уничтожение:

ScoreloopManagerSingleton.destroy();

Кроме того, SDK настойчиво рекомендует все вызовы реализовывать внутри основного UI потока. Если в вашем приложении используются потоки, рекомендуется использовать объекты Android Handler (http://developer.android.com/reference/android/os/Handler.html) и вызывать ScoreloopUI API из основного потока.

Шаг 8. Отправка результата игры на сервер

Ваша активити должна реализовать интерфейс OnScoreSubmitObserver. Он состоит из метода onScoreSubmit, который будет вызван после отправки очков на сервер (очевидно, что эта операция занимает время и блокировать UI поток на такое время нельзя).

Регистрируем активити как наблюдателя за результатами отправки:

ScoreloopManagerSingleton.get().setOnScoreSubmitObserver(this);

Отправляем очки на сервер:

Double scoreResult = 1450.0;
ScoreloopManagerSingleton.get().onGamePlayEnded(scoreResult, null);

В методе onGamePlayEnded второй параметр — это режим игры (например, легкий, сложный и т.д). Поскольку мы не сконфигурировали режимы через веб-интерфейс, передаем null.

Шаг 9. Отображение таблицы результатов

С этим совсем все просто:

startActivity(new Intent(this, LeaderboardsScreenActivity.class));

Вот как это выглядит:



Брендинг


Scoreloop за использование своего сервиса требует, чтобы иконка вашего приложения имела поверх основного изображения небольшой логотип Scoreloop, как, например, здесь:



Делается это якобы для того, чтобы пользователи могли сразу увидеть, что это приложение интегрировано со Scoreloop и начали качать его со страшной силой, но мы то знаем…

Послесловие


Если какие-то вопросы остались непонятны, постараюсь ответить в комментариях. Кроме того, в состав SDK включена подробная и очень понятная документация.

Результаты интеграции, описанные в этой статье, вы можете увидеть в игре Qbrix (ссылка на Маркет, ссылка на .apk):



P.S. Пользуясь случаем, хочу сказать спасибо авторам статей об интеграции AdMob и ACRA в Android приложение. Эти руководства сэкономили мне несколько часов разработки.
Alexey Korepanov @alexaol
карма
64,0
рейтинг 0,0
Fullstack developer
Похожие публикации
Самое читаемое Разработка

Комментарии (7)

  • 0
    Вы писали о внутреигровой валюте, есть ли в Scoreloop есть свой аналог In-App-Purchase?

    P.S. Скорее всего не «Уничтожение», а «Деструктор».
    • 0
      Да, в Scoreloop есть возможность покупать из приложений: пользователь редиректится на специальный URL, где он может купить внутриигровую валюту, оплатив кредиткой.

      Разработчик может потом вывести эти деньги на банковский аккаунт (нужно предоставить банковские реквизиты в Scoreloop), правда деньги с первой покупки переводятся только через три (!) месяца. Подробностей я не знаю, сам этим не пользовался.
  • 0
    Я правильно понял, что на ios scoreloop не предлагает готового ui?
    • 0
      К сожалению, про iOS не могу ничего сказать, я разбирался только с Android.
  • +2
    Для чего нужно READ_PHONE_STATE я точно не знаю
    Чтобы получить uid телефона :)
  • 0
    Извините, но… ни о чем.
  • +1
    Внимание, некропост:
    LeaderboardsScreenActivity больше нет? Неужели в руководстве компании действительно считают, что реализовывать таблицу рекордов каждым отдельным разработчиком по-своему лучше, чем вызов одной готовой активити?..

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.