Привлечение игроков

В Foxnoid уже можно играть, победить или проиграть, но мы не принимались за один важный аспект игры: реиграбельность. Поскольку это слово имеет свой смысл для разных людей и его нет в словаре, давайте определим его примерно как желание игрока заново проходить игру.

Важной частью является желание играть. Мы не ориентируемся на технических особенностях, позволяющих использовать программу заново. В этой главе мы поговорим о то, что мотивирует игроков продолжать играть снова и снова.

Сделайте игру путешествием

Если вы относитесь к своей игре, как к путешествию героев, где продвижение игрока идёт с повышением сложности, то ваша игра станет намного лучше.

Большинство мобильных казуальных игр задействуют эту механику, используя постепенно открывающиеся уровни. Новый уровень становится доступен только после убедительного завершения предыдущего. Angry Birds так делает, как и сотни других игр.

Платформеры также задействуют эту идею, когда игрок движется от уровня к уровню, пока не достигнет успеха. Супербратья Марио — пример этого. Каждый раз, когда Тоад говорит «Принцесса находится в другом замке» мы знаем, что должны идти дальше.

Игроки продолжают играть в эти типы игр, потому что хотят завершить путешествие. Они хотят победить. Они хотят увидеть следующий уровень. Они могут оправдать своё поведение многими способами, но всё, как правило, сводится к одному: «это приятное путешествие и я хочу увидеть, как оно завершится».

Реиграбельность

Реиграбельность означает разные вещи для разных людей, как я уже говорил. Некоторым популярным авторам по разработке игр не нравится термин, потому что он настолько расплывчат, что может запутать. Индустрия разработки игр довольно молода и её жаргон по-прежнему расширяется. К примеру, мореходство довольно старая вещь и его жаргон созревал несколько столетий. Есть много-много способов выразить принципы мореходства. Разработке игр нужно ещё несколько столетий, чтобы жаргон развился и окреп. Тем не менее, у нас нет терпения старых моряков, мы, разработчики игр — группа быстрых людей, пытающихся выразить понятия в этом виде искусства, пока наука и теория до сих пор играют в догонялки.

Поговорим о двух возможных подходах к реиграбельности. Первый — действия по возвращению в игру, пока путешествие не будет завершено. Это о привлечении игроков, чтобы они не забывали игру. Наша цель — вызвать чувства, чтобы заставить их думать «ещё один уровень и всё». Есть много способов, как вызвать такое поведение и некоторые наиболее распространённые методы должны быть известны всем.

  • Лучшие результаты. Игры с таблицей лидеров, куда игрок будет постоянно возвращаться, чтобы убедиться, что его собственный рекорд не побит или посмотреть топ других игроков. Это стало прямо соревнованием с появлением вездесущей сети.
  • Несколько уровней. Прогресс в игре через различные уровни. Чтобы победить, игрок должен завершить каждый уровень. Это зов к страннику внутри каждого из нас. Игроки продолжают играть, потому что они должны закончить путешествие.
  • Коллекционирование и достижения. Некоторые игры предлагают достижения и коллекционирование внутри игры. Люди продолжают играть, чтобы собрать всё. Если пункт выше обращается к нашему внутреннему страннику, то этот обращается к нашему внутреннему скряге. Достижения в сочетании с социальными сетями являются замечательной вещью для привлечения игроков.
  • Сюжет. В некоторых играх важен сюжет и люди будут продолжать играть, потому что хотят узнать, что происходит. Это, как правило, сочетается с уровнями. Квесты были, по моему скромному мнению, вершиной игр с сюжетом. Большинство современных 3D-игр на приставках имеют сюжет. Иногда сюжет недостаточно хорош или не имеет смысла, но всё же мы все ненавидим незаконченных историй, поэтому продолжаем играть.

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

Вторая вещь, которую подразумевают когда говорят о реиграбельности — как заставить игроков продолжить свою игру после окончания путешествия. Или, говоря простым языком, как мы можем заставить кого-то играть снова после того, как он уже победил один раз. Некоторые игры используют коллекционный подход и идут на такие вещи, как «вы выиграли, но ещё не собрали все сверкающие яйца единорога». Другие игры, в основном, казуальные или аркады, используют рейтинги в качестве основной причины для продолжения игры. Другие открывают «жестокий» режим сложности после победы, так что вы можете снова бросить вызов самому себе.

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

Чувство прогресса

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

Повышение сложности

Наряду с уровнями добавляется повышение сложности. Героическое путешествие это ничуть не прогулка в парке. Это ближе к восхождению в гору. Оно начинается довольно легко, но затем становится сложнее по мере приближения к вершине. Уровни дают игроку чувство прогресса, они указывают дорогу. Повышение сложности уровней сделает путь более напряжённым, но это также означает, что будет и больше награда в случае успеха. Чувство, которое мы хотим вызвать, должно быть «Эта игра становится труднее», наряду с «Я становлюсь в этом лучше».

Если вы не увлекаете игрока, то он, как правило, скучает и уходит. Труднейшая известная мне игра Dwarf Fortress, в которой вы моделируете фантазийную колонию гномов. Девиз игры — проигрывать весело. Она имеет крутую кривую обучения, и вы, несомненно, проиграете много раз, но как только начнёте заново, через короткое время потерпите неудачу и начнёте привыкать (погуглите «boatsmurdered» и «dwarf fortress и веселье»).

Я не защищаю игроков-мазохистов, а говорю: не делайте слишком просто. Сделайте это больше похожей на тропу, а не на торговый центр.

Создание новых уровней для нашей игры

Создание сетевых вещей, таких как таблица рекордов и достижений выходит за рамки этой книги. Foxnoid на самом деле не нужен сюжет, так как это просто хорошая традиционная аркадная игра. Для привлечения игроков мы собираемся реализовать несколько уровней. Для краткости сделаем только несколько уровней. Не стесняйтесь добавить их больше в свою игру.

Определение формата уровня

Наша игра имеет три ряда по пять блоков в каждом. Самый простой способ описать уровень — это использовать массив из 15 элементов, которые содержат 0 для пустого пространства или 1 для блока. Каждый уровень будет массивом, а совокупность всех уровней также будет массивом.

Создайте файл с именем levels.js внутри папки js.

levels.js: три разных уровня для нашей игры

var levels = [
  [
    1,1,1,1,1,
    1,0,0,0,1,
    1,1,1,1,1
  ],
  
  [
    1,0,1,0,1,
    1,0,1,0,1,
    1,0,1,0,1
  ],
  
  [
    1,1,1,1,1,
    1,1,1,1,1,
    1,1,1,1,1
  ]
];

Теперь давайте включим этот файл в наш HTML.

index.html: теперь включает уровни

<!DOCTYPE html>
  <html>
  <head>
    <meta charset="UTF-8" />
    <title>Foxnoid Game</title>
    <link rel="stylesheet" href="css/style.css" />
    <script defer src="js/phaser.min.js"></script>
    <script src="js/init.js"></script>
    <script defer src="js/preload.js"></script>
    <script defer src="js/game.js"></script>
    <script defer src="js/game_over.js"></script>
    <script defer src="js/game_win.js"></script>
    <script defer src="js/levels.js"></script>
  </head>
  <body>
  
    <div id="game"></div>
  
  </body>
</html>

Ага, вы заметили глобальную переменную levels в исходном коде выше. Это на самом деле не очень хорошая практика. Лучше всего было бы сделать предварительную загрузку из JSON и хранить в переменной GameStates. В будущих версиях этой книги я мог бы сделать это. Foxnoid это простая игра, и я пытаюсь сохранить исходный код простым, так что мы можем пройти с нуля до завершённой игры. Если вы считаете, что глобальные переменные оскорбляет ваши вкусы, дайте мне знать.

Отображение уровня

Для создания уровней мы должны изменить наш файл game.js. Вначале изменим initWorld(), чтобы добавить константу для начального уровня.

game.js: добавление уровня

initWorld: function() {
  // Некоторые константы
  this.playerSpeed = 250;
  this.ballSpeed = 220;
  this.blocksPerRow = 5;
  this.blockRows = 4;
  this.playerLives = 13;
  this.currentLevel = 0;
  
  // Добавляем фон
  this.add.sprite(0, 0, 'background');
  
 // Добавляем ввод с клавиатуры
  this.cursors = this.input.keyboard.createCursorKeys();
}

Итак, игра начнётся с нулевого (он же первый) элемента массива уровней. Дальше нам нужно отобразить уровень помеченный как this.currentLevel. Для этого изменим addBlocks().

game.js addBlocks() отобразит текущий уровень

addBlocks: function () {
  var level = levels[this.currentLevel];
  var blockNum = 0;
  
  // Не создавать группу блоков,
  // если они уже существуют
  if (!this.blocks) {
    this.blocks = this.game.add.group();
  }
  
  for (var line = 0; line <= this.blockRows - 1; line++) {
    for (var row = 0; row <= this.blocksPerRow - 1; row++) {
      var posY = (line * 30) + 40;
      var posX = (row * 50) + 40;
  
      if (level[blockNum] === 1) {
        var temp = this.add.sprite(posX, posY, 'block');
        this.physics.arcade.enable(temp);
        temp.enableBody = true;
        temp.body.immovable = true;
  
        this.blocks.add(temp);
      }
  
      blockNum += 1;
    }  
  }
}

Если мы сейчас будем играть, то увидим что первый уровень отображается правильно.

Смена уровней

Чтобы изменить работу игры и добавить смену уровней нам просто необходимо поменять расчёт сценария победы. Если никаких блоков не осталось, но текущий уровень ещё не последний, тогда рисуем следующий уровень и продолжаем играть. Для этого мы собираемся изменить функцию checkGameWin().

game.js новая функция checkGameWin()

checkGameWin: function () {
  if (this.blocks.countLiving() === 0) {
    if (this.currentLevel === levels.length - 1) {
      this.state.start("GameWin");
    } else {
      this.currentLevel++;
      this.addBlocks();
      this.resetBall();
    }
  }
}

Мы проверяем, все ли блоки были удалены. Если блоков больше нет, то проверяем, является ли текущий уровень последним. Если это так, то вы победили, если нет, то переходим к следующему уровню, рисуем его и восстанавливаем мяч в исходном положении.

Теперь вперёд и попытайтесь выиграть!

Резюме

Поздравляем!!! Вы прошли путь с нуля до полноценной игры со сценариями победы и поражения и несколькими уровнями! Гордитесь собой, люди редко завершают свои игровые проекты. Незаконченных игр гораздо больше, чем песка на пляже или что-то подобное.

Автор: Андре Гарсия
Последнее изменение: 23.03.2024