Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дипломний проект(пов.).doc
Скачиваний:
2
Добавлен:
17.09.2019
Размер:
3.97 Mб
Скачать

3.4. Метод підвищення реалістичності переміщення на екрані растрових символів за допомогою спрайтів.

Щоб створити ілюзію руху спрайта на деякому фоновому зображенні, необхідна, щонайменше, наступна інформація: поточні координати, лінійні швидкості і покажчики масок для кожної фази фігури. Така сукупність укладена в полях структури спрайта. Крім того, необхідно «запастися» позаекранною копією бітового образу фону.

На словах алгоритм руху описується досить просто. Спочатку позаекранне зображення фону копіюється на канву екрану, затираючи попередній кадр анімації. Потім обчислюється зсув координат, і спрайт перемальовується на новій позиції позаекранного зображення. Вимагається також провести перевірки на вихід рухомої фігури за межі клієнтської області форми.

Форма і структура даних спрайта

Почнемо проектування діючого додатку анімації MoveSprite, перетягуючи на форму наступні компоненти.

- Невидимі об'єкти Sprites і Background класу TImage для постійного зберігання спрайтів (два літаки з файла Planes.bmp) і фону (растрова карта з файла Clouds.bmp).

- Об'єкти DrawBox класу TImage і PaintBox класу TPaintBox спільно реалізують подвійну буферизацію графіки: спочатку фігури і фон малюються на канві невидимого позаекранного об'єкту DrawBox, а потім зображення канви копіюється в екранний об'єкт PaintBox.

- Таймер Timer1 класу TTimer задає швидкість руху спрайтів.

Зображення фаз анімації кожної фігури представлені в об'єкті Sprites бітовими образами, що індексуються, шириною w і висотою h. Растрові маски прозорості спрайтів (на чорному фоні) мають номери 0, 1, 2, 3. Фігури розрізняються кольором і мають однаковий зовнішній контур, тому розділяють загальну пару бінарних силуетів (на білому фоні) з номерами 4, 5 (рис. 3.3).

Глобальні змінні W і H визначають розміри фонового зображення по периметру клієнтської області форми. Константа V задає граничне значення лінійних швидкостей, що вибираються датчиком випадкових чисел. Поточні дані логічних конструкцій двох фігур містяться в масиві структур Sprite[2], поля яких перераховані в табл. 3.1.

Лістинг, містить повний текст кодового модуля MoveMain. Конструктор форми встановлює фігури в початкові позиції методом InitSprite, а потім запускає таймер. За умовчанням інтервал таймера рівний 40, що відповідає кадровій частоті анімації 25 кадрів в секунду. Ядром додатку є обробник події таймера. Метод MoveSprite відповідає за переміщення, змінюючи випадковим чином вектор швидкості кожний раз, коли фігури “обтикатимуться” у фіксовані межі периметра форми. Наступний блок коду реалізує прокрутку фону Background в буфері позаекранного зображення. Канва DrawBox зсовується вліво на величину Shift, створюючи ілюзію руху. Фігури можуть сходитися і розходитися, але загальне враження їх руху зліва направо зберігається. Далі метод DrawSprite малює прозорі спрайти фаз анімації на канві DrawBox. Функція IntersectRect сигналізує про зіткнення фігур, перевіряючи рамки Sprite[I].SR на предмет перетину. Заключний блок коду цілком копіює черговий кадр, що утворився на канві DrawBox, у видимий об'єкт PaintBox.

Рис. 3.3. Зразок форми MoveSprite

Таблиця 3.1

Поля структур спрайтів

Ім'я

Інтервал значень

Зміст

X

Y

-w < X < Wv

0 < Y < Hv-h

Координати лівого верхнього кута

DX

DY

0 < DX < V

-V < DY < V

Лінійні швидкості

MaskOR

MaskAND

0, 1, 2, 3

4, 5

Номери масок прозорості

SR

Rect(X, X+w, Y, Y+h)

Прямокутна рамка спрайта

UR

Визначається функцією UnionRect

Прямокутна рамка, яка об'єднує сусідні фази спрайта

Таблиця 3.2

Співвідношення між приростами та використовуваними функціями

Умова

Функції, що використовуються

dx>0

1 2 7 8

dx<0

3 4 5 6

dy>0

2 3 6 7

dy<0

1 4 5 8

dx=0

1 3

dy=0

2 4

Abs(dx)>abs(dy)

2 4 6 8

Abs(dx)<abs(dy)

1 3 5 7

Abs(dx)=abs(dy)

1 2 3 4

Проте періодичне перемикання масок спрайта створює ілюзію плавного обертання, хоча додаток фактично моделює всього два стани фігури. Розширюючи банк даних спрайта додатковими фазами і відповідними масками, можна добиватися вражаючих ефектів, наприклад стріляючого кулемета.

Виділяємо логіку роботи із спрайтом у відповідний клас. Цей клас інкапсулюватиме, зокрема, поля структури Sprite як члени даних, а також методи ініціалізації, переміщення і малювання. Кожний екземпляр спрайта – це графічний об'єкт позаекранного зображення, а фігура – проста логічна конструкція, описана структурованим масивом. Якщо буде потрібно анімувати більше двох однакових фігур, всі вони розділятимуть єдиний клас спрайта. Істотно розширити функціональність класу спрайта можна було б додаванням операцій з різними зображеннями, як це відбувається в справжніх системах комп'ютерної анімації. Непогано оформити спрайт у вигляді нового графічного компоненту і включити його в VCL.

Описані вище методи реалізації генерації й відображення складних символів дозволяють вирішити більшість завдань НУ ГІС, у випадках, коли не висуваються жорсткі вимоги до виявлення атрибутики зображень однотипних об'єктів. Одним із серйозних недоліків описаних рішень була відсутність при виводі на екран необхідної плавності при відображенні повороту складних зображень. Для усунення цих недоліків нами запропонований матрично-функціональний метод, суть якого полягає в тому, що рух символу, представленого набором матриць базових растрових символів, починається із задання початкової точки траєкторії. Потім запам'ятовується масив, що описує фон та відтворюється зображення символу, з орієнтуванням, що відповідає напрямку його руху по цій траєкторії. Після цього зчитуються наступні координати об'єкта й розраховується кількість кроків до точки, представленої цими координатами. Наступний крок - відновлення фону в «звільненому» від символу місці. Потім запам'ятовується наступна «порція» фону, що відповідає новому місцеположенню рухомого символу. Далі, залежно від напрямку й величини приросту координат, вибирається необхідне зображення з тієї матриці, у якої кут повороту символу найбільш близький до напрямку траєкторії, що визначає спосіб зчитування даних у цій матриці.

У ході експериментальних досліджень встановлено, що для обхвату більшості з можливих напрямків повороту (від 00 до 3600 ) достатньо восьми способів зчитування матриці. Для визначення способу зчитування залежно від кута повороту розроблений і реалізований простий, але ефективний метод, заснований лише на оцінці знаків і величин приростів координат. Для його ілюстрації розглянемо наступний приклад. На рис. 3.4,а представлено зображення літака. У першому рядку показані 5 зображень символу, що описані матрицями: 00, 11,250, 22,50, 33,750, 450. Якщо зчитувати елементи матриці знизу вверх та зліва направо за схемою, наприклад, зображеною на рис. 3.4,б, то з п'яти вихідних матриць одержимо їхні похідні, рис. 3.4,г, з кутом охоплення 900 - 1350.

З приростом координат можна визначити конкретний спосіб зчитування. Так, якщо приріст по горизонталі позитивний (тобто dx>0), то зображення літака повинне бути орієнтоване його коком праворуч, тобто слід використати одну з 4-х функцій зчитування: 1, 2, 7 або 8 (при цих способах зчитування літак у похідних матрицях «дивиться» вправо). Аналогічно можна встановити, що для dx<0 потрібно використати функції 3, 4, 5 або 6. А якщо оцінити приріст по вертикалі, тобто dy, та їхні абсолютні величини, то можна побудувати співвідношення, вид яких представлений у табл. 3.2.

Знаки й абсолютні значення приростів однозначно визначають спосіб зчитування даних з матриць.

Залишається вибрати одну з п'яти матриць. Ця операція виконується після оцінки відношень абсолютних значень приростів координат (dx/dy або dy/dx). Наприклад, якщо при dy=4 значення dx=2, то кут повороту W при цьому дорівнює 22,5 градуса, тобто необхідно вибрати матрицю 2.

Рис. 3.4. Схема алгоритму визначення функції вибору матриці та правила її зчитування

Рис. 3.5. Скріншот роботи програми, яка забезпечує лінійно-обертальний рух символу-спрайта літака у відповідності до запропонованого

методу базових растрових символів

І далі, при dy=4: якщо dx=0, то W=0o (це матриця 0), якщо dx=1, то W=11,25 o (це матриця 1), якщо dx=3, то W=33,75 o (це матриця 3), якщо dx=4, то W=45 o (це матриця 4).

Якщо dx > dy, тобто W > 450, то цей кут можна відраховувати не від вертикалі, а від горизонталі, пам'ятаючи про те, що п'ять матриць охоплюють кут від 00 до 450. Таким чином, не має значення, яке відношення використовується: dx/dy або dy/dx, обмежень на абсолютні значення приростів координат не існує.

Висновки до розділу 3

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]