Клас Camera2D – РОЗРОБКА ІГОР ДЛЯ ОС ANDROID

Обєднаємо всі розглянуті деталі роботи з камерою в один клас Ми хочемо, щоб у ньому зберігалися позиція камери, стандартні ширина і довжина області видимості і змінна масштабу Ми також хочемо мати зручний метод для правильного призначення порту перегляду (завжди використовувати весь екран) і матриці проектування Ще нам потрібен метод для перекладу координат при торканні в координати нашого світу Наш новий клас Camera2D показаний в лістингу 815

Лістинг 815 Camera2Djava: наш новенький клас камери для рендеринга 2D

Як ми вже обговорювали, ми зберігаємо позицію камери, ширину і довжину конуса відображення і змінну масштабу як члени класу Члени позиції камери і змінної масштабу загальнодоступні, тому ми легко можемо управляти ними Нам також потрібна посилання на GLGraphics, щоб брати звідти останні відомі ширину і довжину екрану в пікселах для перекладу координат торкання в координати нашого світу

У конструкторі ми беремо екземпляр класу GLGraphics, ширину і довжину конуса відображення при змінної масштабу 1 як параметри Зберігаємо їх і инициализируем позицію камери, щоб вона дивилася в центр прямокутника, обмеженого координатами (0, 0, 1) і (frustumWidth frustumHeight -1), як на рис 819 Початкове значення змінної масштабу дорівнює 1

Метод setViewport And MatricesO задає область перегляду, що охоплює весь екран, а також задає проекційну матрицю відповідно до параметрів нашої камери, як ми вже говорили раніше Наприкінці методу ми вказуємо OpenGL ES, що всі подальші матричні операції спрямовані на матрицю моделі-виду, і завантажуємо одиничну матрицю Ми будемо викликати цей метод кожен кадр, щоб можна було починати з чистого аркуша І більше ніяких прямих викликів OpenGL ES для встановлення області перегляду і проекційної матриці

Метод touchToWorld приймає член класу Vector2, що містить координати, які отримані при торканні, і переводить вектор у простір світу Це те ж, що ми вже обговорювали єдина різниця в тому, що ми використовуємо наш чудовий клас Vector2

Приклад

Давайте використовуємо клас Camera2D в нашому прикладі з гарматою Я скопіював файл Col1isionTest і перейменував його в Camera2DTest Я також поміняв імя класу GLGame всередині файлу Camera2DTest і перейменував клас Collision-Screen в Camera2DScreen Ми обговоримо тільки невеликі зміни, які треба внести, щоб використовувати наш новий клас Camera2D

Перше, що ми робимо, – додаємо новий член в клас Camera2DScreen: Camera2D camera

Ініціалізіруем цей член класу в конструкторі наступним чином:

Предявляємо наш екземпляр класу GLGraphics, ширину і довжину нашого світу, які ми до цього використовували як ширину і довжину конуса відображення у виклику glOrthof О Зараз потрібно замінити наші прямі виклики OpenGL ES в методі present, який виглядає ось так:

Ми замінюємо їх цим:

Нам, звичайно, ще потрібно очищати кадровий буфер, але всі інші прямі виклики OpenGL ES чудово заховані в методі Camera2D setVi ewportAndMatrices Якщо ви виконаєте цей код, ви побачите, що нічого не змінилося Все працює, як і раніше, – все це ми робили, щоб код був красивіше і зручніше

Ми також можемо трохи спростити метод тесту updateO Оскільки ми додали в клас камери метод Camera2DtouchToWorld, ми можемо використовувати і його теж Ми можемо замінити цей фрагмент методу update:

таким:

Ось тепер все прекрасно оформлено Але було б нудно так і не скористатися всіма можливостями нашого класу камери План такий: ми хочемо, щоб камера дивилася на світ, так би мовити, нормально, поки гарматне ядро ​​не летить Це просто: ми вже робимо це Ми можемо визначити, чи летить ядро, перевіривши, чи дійсно у-координата його позиції менше або дорівнює нулю Оскільки ми завжди застосовуємо до ядра силу тяжіння, воно, звичайно, буде падати, навіть якщо ми не стріляємо їм, тому це простий спосіб перевірки

Наше нововведення стане помітним, коли ядро ​​буде летіти (коли у-координата буде більше нуля) Ми хочемо, щоб камера стежила за ядром Цього можна досягти, встановивши позицію камери на позицію ядра Це дозволить завжди тримати ядро ​​в центрі екрану Також добре б випробувати функціонал масштабування Для цього будемо збільшувати змінну масштабу залежно від у-координати ядра Чим далі від нуля координата, тим більше змінна масштабу Таким чином, камера буде відїжджати, коли у ядра буде більш висока у-координата Ось те, що нам треба додати в кінці методу update на екрані нашого тесту:

Коли у-координата ядра більше нуля, камера буде слідувати за ним і віддалятися Ми просто додамо деяку величину до стандартної змінної масштабу, що дорівнює одиниці Ця величина – відношення між становищем ядра на у-осі і висотою світу Якщо у-координата ядра знаходиться в WORLD HEIGHT, змінна масштабу дорівнюватиме 2, щоб ми бачили велику частину нашого світу Спосіб, яким я це зробив, насправді довільний – ви можете застосувати будь-яку формулу, яку хочете, для даного випадку Якщо позиція ядра менше або дорівнює нулю, показуємо світ в нормальному розмірі, як ми робили в попередніх прикладах

Джерело: 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>

*

*