КЛАС WORLDRENDERER DROID INVADERS

&nbsp

Перерахуємо все, що нам необхідно отрісовать в 3D: корабель – ми зробимо це, використовуючи модель і текстуру корабля і застосувавши освітлення загарбники – це виконаємо, застосувавши модель і текстуру загарбника і знову ж задіявши освітлення постріли на поле бою – зробимо це, грунтуючись на моделі пострілу в цей раз без текстур, але з освітленням щити – виконаємо це, грунтуючись на моделі щита, знову ж таки без текстурирования, але з використанням освітлення та прозорості (див рис 123) вибухи на місці моделі корабля або загарбника – вони, звичайно ж, не висвітлюються

Ми вже знаємо, як написати код для перших чотирьох елементів нашого списку Що ж робити з вибухами

Виявляється, можна використовувати SpriteBatcher Грунтуючись на часі стану вибухає корабля або загарбника, ми можемо отримати текстурний регіон з екземпляра класу Animation, що зберігає анімацію вибуху (дивіться клас Assets) Клас SpriteBatcher може малювати лише текстуровані прямокутники в площині ху, тому нам доведеться знайти спосіб перемістити прямокутник на довільну позицію в просторі (ту, де знаходиться вибухає корабель гравця або загарбника) Ми можемо з легкістю зробити це, використовуючи метод gl Trans 1atef на видовий матриці перед отрисовкой прямокутника за допомогою екземпляра класу SpriteBatcher

Створення початкових умов для отрисовки інших обєктів не складає труднощів У нас є направлене джерело світла, що виходить з правого верхнього кута, а також підсвічування, трохи висвітлює всі обєкти незалежно від їх орієнтації Камера розташовується трохи вище за кораблем Вона дивиться в точку, розташовану перед кораблем Ми будемо використовувати камеру LookAtCamera

Щоб камера слідувала за кораблем, нам необхідно просто зберігати координату її поточної позиції по осі х і синхронізувати позицію точки, на яку спрямована камера в даний момент, з координатою корабля з тієї ж осі

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

Напишемо для всього цього код У лістингу 1212 наведено останній клас гри Droid Invaders

Лістинг 1212 Клас WorldRendererjava займається отрисовкой ігрового світу

Клас WorldRenderer відстежує стан екземпляра класу GLGraphics, з якого ми отримуємо екземпляр класу GL10 У цьому класі також зберігаються екземпляри класів LookAtCamera, AmbientLight, DirectionLight і SpriteBatcher Нарешті, в ньому є член, що відслідковує поточний кут повороту, використовуваний для загарбників

У конструкторі ми, як звичайно, встановлюємо значення членів класу Камера має полі видимості, рівне 67 °, відстань до ближньої площини дорівнює 0,1 одиниці, а відстань до далекої площині одно 100 одиницям Вийшло вікно перегляду з легкістю вмістить весь ігровий світ Ми помістимо його позаду корабля трохи вище нього і повернемо так, щоб воно дивилося в точку (0, 0, -4) Підсвічування має світло-сірий колір, а направлене джерело світла білий і виходить з правої верхньої грані Нарешті, створюємо екземпляр класу Spri teBatcher, який допоможе нам малювати прямокутники вибухів

Метод render Про починається з установки координати камери по осі х, рівний координаті корабля з тієї ж осі Звичайно, ми відповідно встановлюємо значення координати по осі х точки, на яку дивиться камера Таким чином, камера буде слідувати за кораблем Як тільки позиція і точка перегляду оновляться, ми можемо встановити проекційну і видову матриці за допомогою виклику методу LookAtCamera setMatrices Далі встановлюємо всі стани, необхідні для відтворення Нам знадобляться тестування глибини, текстурування, освітлення, а також функціональність квітів матеріалів, тому нам не потрібно буде визначати матеріали обєктів за допомогою виклику методу gl Material Наступні два методи активують підсвічування і направлене джерело світла Після виконання всіх цих дій ми готові малювати наші обєкти

Перший обєкт, який ми отрісовиваємих, – корабель Його отрисовка виконується за допомогою виклику методу renderShipO Далі отрісовиваємих загарбників за допомогою методу render Invaders Оскільки для отрисовки блоків щита і пострілів не потрібно текстурирование, ми відключаємо його для того, щоб зберегти кілька тактів процесора Як тільки це буде виконано, отрісовиваємих постріли і щити з допомогою викликів методів renderShots і renderShields Нарешті, просто відключаємо інші стану OpenGLES

Метод renderShiр починається з перевірки стану корабля Якщо він вибухає, то ми відключаємо освітлення, викликаємо метод renderExpl osionO для отрисовки вибуху на місці корабля і знову включаємо освітлення Якщо корабель цілий, ми повязуємо його текстуру і модель, поміщаємо в стек видову матрицю, пересуваємо його на свою позицію, повертаємо його навколо осі z, в залежності від швидкості і малюємо його модель Нарешті, з стека виштовхується видова матриця (залишаючи в ньому тільки вид камери) і відвязуються вершини моделі корабля

Метод render InvadersО дуже схожий на метод renderShipO Єдина відмінність полягає в тому, що ми в циклі проходимо за списком загарбників, а текстура привязується до мережі до цього Це зменшить кількість привязок і кілька прискорить отрисовку Далі для кожного загарбника перевіряється його стан і отрісовивается або вибух, або нормальна модель загарбника Оскільки привязка моделі і текстури виконується поза циклом, нам доводиться відвязувати їх, а потім привязувати знову перед тим, як отрісовать вибух замість загарбника

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

Отрісовка пострілів за допомогою методу renderShots дуже схожа на отрисовку щитів, за винятком того, що не використовується змішування і змінюється колір вершин (жовтий)

Нарешті, у нас є таємничий метод renderExplosion Ми отримуємо позицію, на якій хочемо отрісовать вибух, а також час стану вибухає обєкта Другий параметр використовується для отримання коректного текстурного регіону з екземпляра класу Animation, так само ми поступали і у випадку з Бобом в грі Великий стрибун

Перше, що нам потрібно зробити, – отримати кадр анімації вибуху, грунтуючись на часі стану Далі включаємо змішування, оскільки вибух має прозорі пікселі, які ми не хочемо перетворювати Розміщуємо поточну видову матрицю в стек і викликаємо метод glTranslatefO, тому все, що ми отрісуем після виклику цього методу, буде розміщено в заданій позиції Далі вказуємо екземпляру класу SpriteBatcher, що збираємося отрісовать прямокутник з використанням текстури вибуху

Виклик наступного методу якраз і є головним Ми вказуємо екземпляру класу Spri teBatcher отрісовать прямокутник в точці (0, 0, 0) (координата по осі 2 не задане, але неявно дорівнює нулю, як ви памятаєте), ширина і висота цього прямокутника рівні 2 одиниці Оскільки ми використовували метод glTrans atef, цей прямокутник буде знаходитися не в центрі координат, а в центрі позиції, визначеної методом glTranslatefO, яка в точності повторює позицію вибухає корабля або загарбника Нарешті, видова матриця виштовхується з стека – і ми знову відключаємо змішування

Ось і все Дванадцять класів, що створюють повноцінну тривимірну гру, що пародіює класичну гру Space Invaders

Пограйте в неї Коли ви закінчите, ми розглянемо питання, повязані з продуктивністю

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

*

*