четверг, 13 июля 2017 г.

Сцены

  Простейший способ для того, чтобы представить карту в виде сцены, - это думать обо всем на карте, размещенные в космосе. Для начала это помогает представить объекты как космические. Хотя, технически, все планеты в космосе движутся быстро, для простых игр, они могут быть представляться как просто неподвижные. Сцена похожа на огромное пространство с объектами, размещенными по всюду. Фактически, одно из лучших использований уровней сцены - это использование для космических игр, в которых телесность может быть представлена не лучшим образом через схемы или жесткое позиционирование. Однако, также сцены хороши для более натуральных игр (как например подводные системы или более сложные платформеры), в которых система сетки будет казаться слишком неуместной и неестественной. Это также тип системы, которую используют 3D игры для представления местоположения всех объектов карты в игры. 
  При использовании системы сцены для игр, которые должны работать как 2D платформеры, платформы должны не иметь гравитации и тип их физических тел должен быть статическим. Поскольку еще нет хорошего редактора сцен для Phaser, каждый объект мира должен быть создан и помещен в сцену в методе создания, входящем в игровое состояние. Вот пример базового подхода, в этом примере группа объектов устанавливается как поверхность, и любой объект, добавленный в эту группу будет вести себя как поверхность. В сущности, мир, созданный в этом примере будет состоять из ряда размещенных платформ (или стен), которые не будут двигаться, когда игрок столкнется с ними.

function setup() {
game.physics.startSystem(Phaser.Physics.ARCADE);
game.physics.arcade.gravity.y = 250;
player = game.add.sprite(200, 100, player);
player.anchor.setTo(.5,1);
game.physics.enable(player, Phaser.Physics.ARCADE);
player.body.drag.x = 1000;
ground = game.add.group();
ground.enableBody = true;
ground.create( 100, 500, ground);
ground.create( 100, 400, ground);
ground.create( 300, 400, rockyGround);
ground.setAll(body.immovable, true);
ground.setAll(body.allowGravity, false);
}
\
  Этот процесс создания каждого отдельного куска уровня и добавления его внутрь функции создания вручную может быстро выйти из под контроля, когда мы имеем дело с огромными уровнями, которые нужно загрузить и настроить. Другой подход, который поможет уменьшить необходимость жестко прописывать данные уровня в функции настройки - это создание набора данных уровня. Этот набор данных может представлять объекты на сцене и указать, где должна быть размещена их графика. Лучший формат данных для использования, когда необходимо немного дополнительных данных для игры - это формат JSON. Вот очень простой пример, как может выглядеть описание JSON уровня.

{
ground: [
{ x: 100, y: 500, key: ground },
{ x: 100, y: 400, key: ground },
{ x: 300, y: 400, key: rockyGround }
]
}

  Формат JSON указывает ключи используемых ресурсов, которые ссылаются на ресурсы в кэше ресурсов Phaser. Он также дает координаты для расположения ресурсов после их создания. Этот конкретный пример только для поверхности, но другие объекты могут быть созданы и указаны в других массивах с названиями "собираемое", "враги" или "ловушки". Следующие шаги в процессе загрузки данных и последующее использование данных для создания объектов на сцене, что делает их неподвижными объектами поверхности в игре, как и раньше:


function preload() {
game.load.json(scene_data,data/scene_data.json);
}
function setup() {
var sceneData = game.cache.
getJSON(scene_data);
ground = game.add.group();
ground.enableBody = true;
var currentObject;
for(var i = 0; i < sceneData.ground.length; i++) {
currentObject = sceneData.objects[i];
ground.create(currentObject.x, currentObject.y, currentObject.key);
}
ground.setAll(body.immovable, true);
ground.setAll(body.allowGravity, false);
}

  При условии, что другие ресурсы были загружены раньше, мы добавляем новую строку в метод предварительной загрузки, которая загружает данные JSON файла. Любой загруженный файл JSON может быть доступен из кэша Phaser через "game.cache.getData". При доступе он возвращает объект JavaScript, который может быть доступен через оператор точки, как и любой другой объект JavaScript. Используя этот подход к размещению сцены, становится легко отделять объекты сцены от кода, который фактически выполняет все настройки игрового состояния. Одно потенциальное преимущество этого метода - повышенный шанс того, что фактическое расположение игрового мира может иметь место и в другом приложении, которое просто экспортировало JSON для его использования в Phaser.

Комментариев нет:

Отправить комментарий

Экспорт из PhysicEditor   Когда все фигуры удовлетворяют вашему вкусу и вы готовы перенести работу в Phaser, необходимо экспортировать д...