Шрифт:
Фоновая карта
Вы можете подумать, что фоновая карта в программе Wanderer 2 будет точно такая же, как и в мидлете Wanderer, однако это не так, в ней будет существенное отличие. Если вы вспомните программу Wanderer, то герой не мог передвигаться по воде. Такое ограничение было сделано простым вычислением текущего положения спрайта персонажа. Поскольку, используя слой-барьер, можно с легкостью ограничить перемещение спрайта персонажа, то нет необходимости ограничивать движение героя, создавая специальный код. Важно также то, что теперь нет необходимости создавать элементы в тех местах, где будет размещаться слой-барьер.
Чтобы представить, о чем я говорю, посмотрите на рис. 11.2, теперь фоновому слою не нужны границы.
Рис. 11.2. Теперь фоновому слою не нужны границы, поскольку они будут покрыты элементами с изображением воды слоя-барьера
Черная область, которую вы видите вокруг области суши на рисунке, – это прозрачные элементы слоя, которые не содержат графики. Аналогичные элементы, расположенные в слое-преграде, будут заполнены изображением воды, которое будет ограничивать перемещения персонажа. На самом деле, как вы увидите чуть позже, травянистый берег будет ограничен скалами слоя-преграды. А пока посмотрим на код карты фонового слоя:
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0,
0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0,
0, 2, 2, 2, 2, 5, 15, 15, 15, 15, 15, 15, 6, 2, 2, 0,
0, 2, 2, 2, 2, 7, 10, 1, 1, 1, 1, 1, 16, 2, 2, 0,
0, 2, 2, 2, 2, 2, 14, 1, 1, 1, 1, 1, 16, 2, 2, 0,
0, 2, 2, 2, 2, 2, 7, 10, 1, 1, 1, 1, 16, 2, 2, 0,
0, 2, 2, 2, 2, 2, 2, 14, 1, 1, 1, 1, 16, 2, 2, 0,
0, 2, 2, 2, 2, 2, 2, 14, 1, 9, 10, 1, 16, 2, 2, 0,
0, 2, 2, 5, 15, 6, 2, 14, 1, 11, 12, 1, 16, 2, 2, 0,
0, 2, 2, 14, 1, 16, 2, 7, 13, 13, 13, 13, 8, 2, 2, 0,
0, 2, 2, 7, 13, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0,
0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0,
0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0К сожалению, этот код не имеет особого смысла, если не посмотреть на изображение, ассоциированное с этим замощенным слоем. На рис. 11.3 показаны элементы слоя, которые используются для построения фонового слоя.
Если вы индексам поставите в соответствие изображения, то вам нетрудно будет представить карту, показанную на рис. 11.2; помните, что ячейкам с индексом 0 соответствуют прозрачные области замощенного слоя, а следовательно, в этих областях не будет ничего выводиться. Карту слоя-барьера вы увидите в следующем разделе и поймете, почему края фонового слоя прозрачны. Карта преград
Слой-барьер разработан таким образом, что он выводится поверх фонового слоя. Это означает, что графика слоя-барьера выводится поверх графики фонового слоя. Более того, мидлет Wanderer 2 разработан так, что этот слой ограничивает перемещение спрайта персонажа. Иначе говоря, пустые ячейки слоя барьера означают те области карты, по которым герой может передвигаться.
На рис. 11.4 показан слой-барьер, черные области соответствуют тем областям, в которых персонаж может свободно перемещаться.
Большая часть слоя-барьера прозрачна – персонаж может свободно перемещаться. Даже фрагмент лабиринта содержит значительные прозрачные области, означающие свободу передвижения героя. Ниже приведен код карты слоя, показанного на рис. 11.4:
– 1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, 1, -1, 1,
–1, -1, -1, 1, 1, -1, 1, -1, 1, 1, -1, 1, -1, -1, 1, -1,
–1, 21, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 22, 1,
–1, 18, 0, 5, 5, 5, 5, 8, 0, 0, 8, 0, 0, 0, 20, -1,
–1, 18, 0, 0, 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 20, 1,
–1, 18, 7, 7, 7, 11, 7, 8, 0, 0, 10, 5, 0, 0, 20, -1,
–1, 18, 0, 11, 0, 0, 11, 7, 7, 12, 0, 0, 0, 0, 20, -1,
–1, 18, 0, 7, 7, 7, 0, 11, 12, 8, 0, 0, 0, 0, 20, 1,
–1, 18, 0, 11, 12, 0, 15, 10, 0, 8, 0, 0, 0, 0, 20, 1,
–1, 18, 0, 0, 13, 0, 10, 5, 5, 9, 0, 0, 0, 0, 20, -1,
–1, 18, 7, 10, 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1,
–1, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, -1,
–1, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1,
–1, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 1,
–1, 23, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 24, -1,
–1, -1, 1, -1, 1, -1, 1, 1, 1, -1, 1, -1, -1, 1, 1, -1Этот код карты сложно понять, не имея представления о том, какие изображения стоят за индексами. На рис. 11.5 показаны изображения, из которых создается замощенный слой-барьер.
Возвращаясь к коду карты, сложно не заметить, что в карте присутствуют элементы с отрицательными индексами. Если вы вспомните, о чем шла речь чуть раньше в этой главе, отрицательные индексы используются для обозначения анимационных элементов слоя. В нашем примере элементы с индексом -1 означают анимационный элемент с изображением воды. Обратите внимание, что одни элементы в замощенном слое-барьере имеют индекс -1, а другие – статические, с индексом 1. Это делает анимацию более реалистичной, потому что не все элементы должны изменяться одновременно.
Более подробно с созданием анимации элементов слоя вы познакомитесь в следующем разделе. А перед тем как вы перейдете к ней, посмотрите на то, как выглядят фоновый слой и слой-барьер вместе (рис. 11.6).
Рисунок 11.6 должен прояснить все, что касается пустых элементов слоев. Пустые элементы фонового слоя оказываются под элементами слоя-барьера, в то время как сквозь пустые элементы слоя-преграды видны трава и песок фонового слоя. Слои – это сущность примера Wanderer 2, это отражается в коде, который будет приведен далее.
Написание программного кода
В примере Wanderer 2 необходимо ввести ряд переменных для управления дополнительным слоем, менеджером слоев, окном вида, а также текущим изображением воды. Ниже приведены наиболее важные переменные мидлета Wanderer 2:
private LayerManager layers;
private int xView, yView; //Важно отслеживать положение окна вида менеджера слоев
private TiledLayer backgroundLayer;
private TiledLayer barrierLayer;
private int waterDelay, waterTile;
private Sprite personSprite;Первая переменная – это менеджер слоев, в ней нет ничего удивительного. Переменные xView и yView хранят координаты положения окна вида – текущей видимой области слоев. Если вы вспомните, о чем шла речь ранее, окно вида используется для отображения видимой области слоев, при этом отпадает необходимость перемещать сами слои, как это было сделано в примере Wanderer.
Переменные waterDelay и waterTile помогают создавать анимационные элементы с изображением воды. Первая из этих переменных задает скорость анимации, а вторая содержит номер выводимого на экран изображения.
Два слоя создаются как объекты класса TiledLayer. Следующий код задает одинаковые размеры слоев: