ЕКРАН РЕКОРДІВ MRNOM – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

&nbsp

Екран рекордів просто виводить пять кращих результатів, які ми зберігаємо в класі Setti ngs, плюс заголовок, що повідомляє користувачеві, що він знаходиться на екрані рекордів Ще тут є кнопка в нижньому лівому кутку, яка при натисканні повертає нас в головне меню Найцікавіше в цьому – як візуалізувати таблицю рекордів Для початку подивимося на те, як ми визуализируем зображення, показані на рис 64

Рис 64 Екран рекордів без рекордів

Він виглядає таким же простим, як і інші екрани, які ми реалізували Однак як намалювати змінюються рекорди

Отрісовка чисел: короткий вступ

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

У нашому розпорядженні є дві речі: зображення numberspng і 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 нам необхідно отрісовать для того чи іншого символу Для цього нам потрібні х-і у-координати верхнього лівого кута цій частині, а також її ширина і висота У-координат-та завжди дорівнюватиме нулю, що очевидно, якщо подивитися на рис 61 Висота також є константою, в нашому випадку це 32 Ширина дорівнює або 20 пікселів (якщо символ – цифра), або 10 пікселів (якщо це точка) Єдина величина, яку нам необхідно обчислити, – це х-координата частини зображення numbers png Для цього ми застосуємо невелику хитрість

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

Таким чином, ми отримаємо 0 для символу 0, 3 х 20 = 60 для символу 3 і т д Це точна координата частині кожної цифри Звичайно, такий принцип непридатний до точки, так що з нею ми зробимо інакше Підібємо підсумки в методі, який може відображати одну з наших рядків рекордів, за наявності конкретної рядки, а також маючи координати х і у, в яких повинно починатися відображення

Ми перебираємо всі символи рядка Якщо поточний символ – пробіл, просто збільшуємо координату х на 20 пікселів В іншому випадку ми розраховуємо х-координату і ширину конкретній області (ділянки) символу в зображенні numbers png Символом в даному випадку може бути або точка, або цифра Далі малюємо поточний символ і збільшуємо положення по осі х на ширину символу, який ми тільки що намалювали Цей метод, природно, не буде працювати, якщо ми будемо використовувати будь-що крім прогалин, цифр і крапок Як ви думаєте, чи можна зробити так, щоб він працював з будь рядком

&nbsp

Реалізація екрану

Взявши на озброєння нові знання, ми зможемо без праці реалізувати клас HighscoreScreen (лістинг 67)

Лістинг 67 HighscoreScreenjava, наші труди дають плоди package combadogi сandroidgamesmrnom

Оскільки ми як і раніше не збираємося сваритися зі складальником сміття, ми зберігаємо рядки пяти кращих результатів в елементах масиву Ініціалізіруем рядки, спираючись на масив Settings, highscores в конструкторі

Далі визначається метод update, який, як звичайно, досить тривіальний Ми перевіряємо, чи відбулося торкання кнопки в нижньому лівому кутку Якщо відбулося, програємо звук натискання і переходимо назад до MainMenuScreen

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

Далі проходимо в циклі пять рядків, встановлених в конструкторі, – по одній на кожен рекорд Малюємо кожну рядок за допомогою методу di uwText Перший рядок починається в координатах (20 100), наступна – В координатах (20 150) і т д Просто збільшуємо у-координату для візуалізації тексту на 50 пікселів для кожної лінії, щоб у нас були гарні вертикальні інтервали між рядками

Нарешті, малюємо кнопку

Решта методи зрозумілі без пояснення Перейдемо до недостатнього блоку гри Містер Ном – ігровому екрану

Джерело: Mario Zechner / Маріо Цехнер, «Програмування ігор під Android», пров Єгор Сидорович, Євген зазноби, Видавництво «Пітер»

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*