Статьи

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

Разработчики игр полагаются на такие сервисы, как  Kii Cloud,  чтобы получить все, что им нужно, чтобы иметь надежный, масштабируемый игровой сервер, который работает на всех платформах, которые поддерживает их игра. Это устраняет сложность серверной реализации, обеспечивает мягкую кривую обучения и позволяет вам сосредоточиться на создании своей игры.

В этой статье мы продолжим нашу серию, чтобы показать независимым разработчикам игр ценность мобильного серверного сервиса (охватывающего конкретные связанные с игрой потребности, такие как распределенное ведение рекордов, регистрация пользователей, хранение игровых данных и социальные взаимодействия между пользователями). Если вы пропустили часть 1, в которой мы создали менеджер игровых предпочтений в облаке, см.  Эту статью .

Мы снова будем использовать Android-игру с открытым исходным кодом « Frozen Bubble ». Это хорошая игра, изначально созданная для Linux с приличным портом Android, которая не включает в себя никаких функций бэкенда.

FrozenBubble поддерживает высокие оценки игрока в локальной базе данных SQLite. Если вместо этого вы используете Kii Cloud, вы можете не только сохранять высокие баллы в облаке, чтобы, возможно, позже выполнять интересную игровую  аналитику,  но и экономить на строках кода (продолжайте читать). Давайте посмотрим, как управлять высокими баллами в облаке. Прежде всего, для реализации локальной высокой оценки требуется 3 уровня абстракции: обертка базы данных (со всеми низкоуровневыми командами SQL), уровень объекта данных (DAO), который служит промежуточным уровнем между базой данных и остальной частью Мир и класс менеджера (который эффективно управляет операциями с высокими баллами). В целом, чтобы сохранить высокий балл, вам необходимо следующее:

   /**
     * HighscoreDB - First of all, create the table
     */
   public void onCreate(SQLiteDatabase db) {
      db.execSQL("CREATE TABLE " + TABLE_NAME + " (id INTEGER PRIMARY KEY, level INTEGER, name TEXT, shots INTEGER, time LONG)");
   }

    /**
     * HighscoreDB - Insert a high score record into table (low level)
     */
    public long insert(HighscoreDO hi) {
      insertStmt.bindLong(1, hi.getLevel());
      insertStmt.bindString(2, hi.getName());
      insertStmt.bindLong(3, hi.getShots());
      insertStmt.bindLong(4, hi.getTime());
      return insertStmt.executeInsert();
    }

    /**
     * HighscoreManager - Insert a high score record into table (high level)
     */
    public void endLevel(int nbBubbles) {
      long endTime  = System.currentTimeMillis();
      long duration = (endTime - startTime) + pausedTime;
      if ( duration < 0 ) duration = 0;
      lastScoreId = db.insert(new HighscoreDO(currentLevel, "anon", nbBubbles, duration));
    }

Что бы вы подумали, если бы могли уменьшить это в следующем фрагменте кода, перенося функциональность в облако?

    /**
     * HighscoreManager
     * @param nbBubbles - The number of bubbles launched by the player.
     */
    public void endLevel(int nbBubbles) {
      long endTime = System.currentTimeMillis();
      long duration = (endTime - startTime) + pausedTime;
      if (duration < 0) duration = 0;

      KiiObject highscore = userBucket.object();
      highscore.set("level", currentLevel);
      highscore.set("name", "anon");
      highscore.set("shots", nbBubbles);
      highscore.set("time", duration);

      highscore.save();
      lastScoreId = highscore.toUri().hashCode();
    }

Нет создания таблиц, нет операторов SQL, нет локального хранилища. Ваш объект идет прямо в облако. Начинаете чувствовать, что ваша жизнь становится легче? Мы даже не используем объект DAO для обеспечения постоянства объекта (это не обязательно, если вы знаете поля, которые установлены в объекте).

Таким образом, наши высокие результаты теперь отправляются в облако. Как мы их вернем? Если вы проверите оригинальную локальную реализацию БД FrozenBubble, вы увидите, что высокие баллы получены с помощью стандартных запросов SQL:

    /**
     * HighscoreManager - get high scores (high level)
     */
    public List getHighscore(int level, int limit) {
      return db.selectByLevel(level, limit);
    }

    /**
     * HighscoreDB - get high scores (low level)
     */
    public List selectByLevel(int level, int limit) {
      List list = new ArrayList();
      Cursor cursor = db.query(TABLE_NAME, null, "level=" + level, null, null, null, "shots asc, time asc", "" + limit);
      if (cursor.moveToFirst()) {
        do {
          list.add(new HighscoreDO(cursor.getInt(0), cursor.getInt(1), cursor.getString(2), cursor.getInt(3), cursor.getLong(4)));
        } while (cursor.moveToNext());
      }
      if ((cursor != null) && !cursor.isClosed()) {
        cursor.close();
      }
      return list;
    }

Для нашей облачной реализации мы используем запросы Kii:

    /**
     * HighscoreManager - get high scores
     */
    public List getHighscore(int level, int limit) {
      List highscores = new ArrayList();
      // Define query condition: fetch by level
      KiiQuery query = new KiiQuery(KiiClause.equals("level", level));
      // Sort results
      query.sortByAsc("shots");
      query.sortByAsc("time");
      // limit number of objects in result
      query.setLimit(limit);		
      // Query the bucket
      KiiQueryResult result = userBucket.query(query);
      List objList = result.getResult();
      // Iterate result and populate highscore object collection
      for (KiiObject obj : objList){
        HighscoreDO objdo = new HighscoreDO(
                  obj.toUri().hashCode(), 
                  obj.getInt("level", 0), 
                  obj.getString("name", "anon"), 
                  obj.getInt("shots", 0), 
                  obj.getLong("time", 0));
        highscores.add(objdo);
      }
      return highscores;
    }

Здесь мы заполняем объект DAO для возврата его в подпрограммы визуализации игры в качестве примера, но вы также можете напрямую предоставить объект Kii, если вы соответствующим образом адаптируете приложение. Запросы Kii очень мощные и легко читаемые; Для получения дополнительной информации, пожалуйста, проверьте нашу  документацию .

Если вам интересно, конечный результат (отображение рекордов) выглядит так:

В целом, работать с менеджером рекордов в Kii Cloud очень просто (и очень похоже на менеджер предпочтений в предыдущем посте). Вы можете попробовать  пример приложения Frozen Bubble  с   реализацией HighscoreManager, которую вы можете использовать в своем собственном приложении. Один совет: в примере используются синхронизирующие вызовы к облачному сервису, из-за которых игра теряет некоторые кадры. Несмотря на то, что это не заметно, я настоятельно советую вам использовать асинхронные версии этих методов (например,  save () ), которые возвращаются автоматически и используют обратный вызов, чтобы сообщить вам, что произошло, или дать вам результаты.

Если вы хотите углубиться в управление данными с помощью Kii Cloud, пожалуйста, ознакомьтесь с нашей превосходной  документацией . Я буду продолжать добавлять функциональные возможности в Frozen Bubble с помощью Kii Cloud, поэтому следите за обновлениями (например, push-уведомления, чат, аналитика и т. Д.)

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