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

0

AndroidFastRenderView: собрать-растянуть, собрать-растянуть

По названию данного класса, которое переводится примерно как вид для быстрого отображения в Android, вы можете сами догадаться, что нам предстоит. В предыдущей главе мы обсуждали использование SurfaceView для продолжительной визуализации в отдельном потоке, который также может содержать основной цикл нашей игры.

Мы разработали очень простой класс FastRenderView, унаследованный от SurfaceVi ew. Убедились, что вписываемся в жизненный цикл активности, и настроили поток, в котором происходит визуализация в SurfaceView с помощью Canvas.

Мы вновь воспользуемся классом FastRenderView и дополним его, чтобы он мог выполнять еще несколько задач: хранить ссылку на экземпляр класса Game, чтобы иметь возможность получить активный Screen. Мы постоянно вызываем методы Screen.updare и Screen. presentO из потока FastRenderView; следить за дельтой времени между кадрами, которая передается активному Screen; принимать искусственный фреймбуфер, в котором функционирует экземпляр Androi dGraphi cs, и передавать это изображение в Surf aceVi ew, при необходимости масштабируя его.

В листинге 5.14 показано, как реализовать класс AndroidFastRenderView.

Листинг 5.14. AndroidFastRenderView.Java, поток SurfaceView выполняет код нашей игры.

Это должно быть вам уже знакомо. Нам просто нужно хранить еще два члена: экземпляр класса Androi dGame и экземпляр класса Bi tmap, которые представляют наш искусственный фреймбуфер. Другие члены аналогичны тем, что использованы в FastRenderView.

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

Метод resume является точной копией метода FastRenderVi ew. resume, так что нам не придется проходить через все это снова. Просто удостоверимся, что поток нормально работает с жизненным циклом активности.

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

ПРИМЕЧАНИЕ

Наносекунда – это одна миллиардная доля секунды.

На каждой итерации цикла мы начинаем с получения разницы между временем начала предыдущей итерации и текущим временем. Чтобы упростить работу с дельтой времени, переводим все в секунды. Далее сохраняем текущую временную метку, которую будем использовать на следующей итерации, чтобы подсчитать следующую дельту времени. С помощью данных о дельте времени вызовем методы update и present текущего Screen, которые обновят логику игры и визуализируют объекты в искусственном фреймбуфере. Наконец, удерживаем Canvas для Surf aceView и рисуем искусственный фреймбуфер. Масштабирование осуществляется автоматически в случае, если конечный прямоугольник, который мы передаем методу Canvas .drawBitmap, меньше или больше, чем фреймбуфер.

Обратите внимание, что здесь мы использовали сокращенный способ получения конечного прямоугольника, растянутого на весь SufaceView при помощи метода Canvas. getClipBounds . Он присвоит членам top и left, относящимся к dstRect, значение 0, а членам bottom и right – реальные размеры экрана (например, 480 х 800 в портретной ориентации в Nexus One). Оставшаяся часть метода полностью совпадает с тем, что мы делали в тесте FastRenderVi ew. Она просто проверяет, что поток останавливается, когда активность ставится на паузу или удаляется.

Последний метод в этом классе, pauseO, полностью совпадает с методом FastRenderView.pause. Он просто заканчивает визуализацию основного цикла потока и ожидает, пока этот цикл полностью закончит работу.

Мы почти закончили с нашим фреймворком. Все, что нам осталось, – реализовать интерфейс Game.

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

По теме:

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