Главная » Программирование игр под Android » ЭКРАН РЕКОРДОВ MRNOM – РАЗРАБОТКА ИГР ДЛЯ ОС ANDROID

0

 

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

Рис. 6.4. Экран рекордов без рекордов

Он выглядит таким же простым, как и другие экраны, которые мы реализовали. Однако как нарисовать изменяющиеся рекорды?

Отрисовка чисел: краткое введение

У нас есть графический ресурс, называющийся numbers. png и содержащий все цифры от 0 до 9 плюс точка. Размер каждой цифры – 20 х 32 пиксела, а точки – 10 х 32 пиксела. Цифры размещены слева направо в возрастающем орядке. Экран рекордов должен показывать пять строк, каждая из которых отображает одни из пяти лучших результатов. Каждая строка должна начинаться с позиции рекорда (например, 1 или 5), затем идет пробел и сам результат. Как это сделать?

В нашем распоряжении есть две вещи: изображение numbers.png и Graphics. drawPixmap, который позволяет нам нарисовать на экране часть изображения. Допустим, мы хотим, чтобы первая строка списка рекордов, задаваемая по умолчанию, например 1. 100 была отображена с координатами (20; 100) так, чтобы верхний левый угол цифры 1 совпадал с этими координатами.

Вызываем Graphics. drawPi xmap следующим образом:

Мы знаем, что цифра 1 имеет ширину 20 пикселов. Следующий символ нашей строки будет отображен с координатами (20 + 20; 100). В строке  1. 100. данным символом является точка, ширина которой в изображении numbers. png равна 10 пикселов:

Следующий символ в строке должен быть визуализирован с координатами (20 + 20 + 10; 100). Этот символ – пробел, который нам отрисовывать не нужно. Все, что необходимо сделать, – продвинуться по оси х на 20 пикселов, поскольку, как вы догадываетесь, это размеры пробела. Следующий символ 1 будет, соответственно, визуализирован с координатами (20 + 20+ 10 + 20; 100). Вы уже уловили закономерность?

Имея координаты верхнего левого угла нашего первого символа в строке, мы можем перебрать в цикле все символы строки, нарисовать символ и увеличить х-координату для следующего отрисовываемого символа на 20 или 10 пикселов в зависимости от символа, который мы только что нарисовали.

Нам также необходимо выяснить, какую часть изображения numbers. png нам необходимо отрисовать для того или иного символа. Для этого нам нужны х- и у-координаты верхнего левого угла этой части, а также ее ширина и высота. У-координа-та всегда будет равна нулю, что очевидно, если посмотреть на рис. 6.1. Высота также является константой, в нашем случае это 32. Ширина равна или 20 пикселов (если символ – цифра), или 10 пикселов (если это точка). Единственная величина, которую нам необходимо вычислить, – это х-координата части изображения numbers. png. Для этого мы применим небольшую хитрость.

Символы в строке могут быть интерпретированы как Юникод или как 16-битные целые числа. Это значит, что мы фактически можем производить вычисления с символьными кодами. По счастливой случайности символы 0-9 представлены последовательными возрастающими целыми числами. Мы можем использовать этот факт для того, чтобы рассчитать значение по оси х на изображении number. png.

Таким образом, мы получим 0 для символа 0, 3 х 20 = 60 для символа 3 и т. д. Это точная координата части каждой цифры. Конечно, такой принцип неприменим к точке, так что с ней мы поступим иначе. Подведем итоги в методе, который может отображать одну из наших строк рекордов, при наличии конкретной строки, а также имея координаты х и у, в которых должно начинаться отображение.

Мы перебираем все символы строки. Если текущий символ – пробел, просто увеличиваем координату х на 20 пикселов. В противном случае мы рассчитываем х- координату и ширину конкретной области (участка) символа в изображении numbers. png. Символом в данном случае может быть либо точка, либо цифра. Далее рисуем текущий символ и увеличиваем положение по оси х на ширину символа, который мы только что нарисовали. Этот метод, естественно, не будет работать, если мы будем использовать что-либо кроме пробелов, цифр и точек. Как вы думаете, можно ли сделать так, чтобы он работал с любой строкой?

 

Реализация экрана

Взяв на вооружение новые знания, мы сможем без труда реализовать класс HighscoreScreen (листинг 6.7).

Листинг 6.7. HighscoreScreen.java, наши труды дают плоды package com.bad.ogi с.androidgames.mrnom;

Поскольку мы по-прежнему не собираемся ссориться со сборщиком мусора, мы сохраняем строки пяти лучших результатов в элементах массива. Инициализируем строки, опираясь на массив Settings, highscores в конструкторе.

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

Метод presentO достаточно прост при использовании в сочетании с методом drawText О, который мы недавно описали. Сначала мы, как обычно, визуализируем фоновое изображение вместе с частью HIGHSCORES (Рекорды) изображения Assets mai nmenu. Мы могли бы сохранить его в отдельном файле, но используем уже имеющийся ресурс, чтобы не занимать лишней памяти.

Далее проходим в цикле пять строк, установленных в конструкторе, – по одной на каждый рекорд. Рисуем каждую строку с помощью метода di uwText. Первая строка начинается в координатах (20; 100), следующая – в координатах (20; 150) и т. д. Просто увеличиваем у- координату для визуализации текста на 50 пикселов для каждой линии, чтобы у нас были красивые вертикальные интервалы между строками.

Наконец, рисуем кнопку.

Оставшиеся методы понятны без объяснения. Перейдем к недостающему блоку игры Мистер Ном – игровому экрану.

Источник: Mario Zechner / Марио Цехнер, «Программирование игр под Android», пер. Егор Сидорович, Евгений Зазноба, Издательство «Питер»

По теме:

  • Комментарии