Основи спрайтові анімації

Журнал "Світ ПК"

Досить часто в конференціях Fidonet, присвячених програмуванню та розробці комп'ютерних ігор, зустрічаються питання по спрайтові анімації. Починаючі програмісти теж, напевно, хотіли б почитати що-небудь на цю тему, а ще краще – просто подивитися, як діє подібна простенька програма. Чи може бути щось більш цікаве для школяра, ніж самому написати комп'ютерну гру.

На уроках інформатики або факультативних заняттях, де розглядається матеріал виходить за рамки шкільної програми, учням, як правило, пропонували працювати з процедурами модуля Graph. Для навчальних цілей або створення статичної графіки це, можливо, і непоганий варіант, але от для анімованої він явно не годиться через екранного режиму і набору процедур модуля Graph. Для анімації 16-кольорові режими не дуже підходять, оскільки вимагають досить складної структури відеопам'яті, а також постійного звернення до регістрів відеоадаптера, що значно сповільнює роботу. Тому для нашого прикладу ми не будемо користуватися ні модулем Graph, ні стандартними для Borland Pascal відеорежиму.

Отже, приймемо режим 256 кольорів і дозвіл 320×200 пікселів. Цей стандартний відеорежим – найпростіший з точки зору організації відеопам'яті. У даному випадку вона є великим байтовий масив розміром 320×200 точок, де кожен байт відповідає певній точці. Таким чином, точка з координатами (x, y) знаходиться у відеопам'яті зі зміщенням x + 320y. Для зручності опишемо екран як двовимірний масив, будь-який байт якого може приймати 256 різних значень, так що на екрані одночасно може з'являтися до 256 кольорів, причому кожному значенню байта відповідає свій колір, який визначається регістрами палітри. Значить, записуючи байт в встановлене місце відеопам'яті, ми «запалюємо» точку.

Оскільки стандартні драйвери екрана не підтримують обраний нами режим, встановимо його безпосередньо через VideoBIOS. Крім того, не підключені графічні драйвери, а тому немає і стандартних функцій, що дозволяють малювати точку, лінію, коло, прямокутник, – правда, точку можна зобразити через той же VideoBIOS, але робиться це дуже повільно. Втім, в спрайтові анімації такі функції і не потрібні, шкода тільки, що пропадають ті з них, які забезпечують виведення тексту. У принципі можна скористатися і підтримують 256 кольорів бібліотеками (на жаль, в стандартну поставку Вorland / Turbo Рascal вони не входять), однак вони годяться лише для виведення тексту або розкреслюванням рамок. Зрештою, висновок тексту – окрема розмова, і до нього ми ще повернемося.

Тепер про спрайту

Зустрічаються і такі тексти програм, де малюнки спрайтів вводяться в масив числових констант прямо з клавіатури. Один курсор миші створити так, звичайно, можна, а ось спрайт розміром, скажімо, 128×128 точок – Вельми проблематично. Таким чином, для виготовлення спрайтів слід користуватися не текстовим, а графічним редактором. Найпростіше – вивчити формат BMP-файлів і «читати» спрайт з них. Але спершу давайте швидше отримаємо перший результат. Для цього зробимо наступним чином: візьмемо редактор Paint, задамо розмір зображення 20×20 точок (пункти "Малюнок • Атрибути») і намалюємо що-небудь на білому тлі, а потім у файл з ім'ям sprt01.bmp запишемо це зображення, причому обов'язково в режимі 256 кольорів, інакше це буде неправильно сприйнято нашою програмою. Перші 1078 байт отриманого файлу займе заголовок, що містить інформацію про розміри зображення, що використовуються кольорах і т. д. Спочатку розмір зображення ми поставимо в програмі жорстко, а кольори будемо ігнорувати.

Висновок на екран

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

Реальні спрайт рідко мають прямокутну форму, тому виводити слід лише окремі точки зчитаного зображення, включивши для цього поняття «прозорий колір». У даному випадку ми вибираємо білий колір з кодом 255 ($ FF). При виведенні спрайту малюються лише ті точки, код яких не дорівнює 255 (для «прозорого кольору» можна взяти будь-яке значення: 0, 5, 31 – як вам буде зручно).

Щоб швидкість роботи програми не залежала від продуктивності комп'ютера, застосуємо синхронізацію з зворотним ходом кадрової розгортки. Вона також позбавить і від мерехтіння. У більш складних програмах ці дві функції реалізуються за допомогою різних механізмів незалежно один від одного.

Текст створеної нами програми див в лістингу. Щоб описати спрайт, визначаємо запис SpriteType. Для прямого доступу до відеопам'яті використовуємо масив Mem, а для виклику функції VideoBIOS – процедуру intr. Отже, що ж вийшло?

До речі, спробуйте відключити (закоментувати) очікування зворотного ходу і подивіться, що з цього вийде.

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

Короткий глосарій

Відеопам'ять – Пам'ять, аналогічна оперативної, але тільки встановлена в відеоконтролері. У неї записується зображення, яке ми бачимо на моніторі. Доступ до даної пам'яті вимагає набагато більше часу, ніж до ОЗУ.

Відеорежими. Є кілька режимів роботи відеоконтролера, що розрізняються способом відображення на екран вмісту відеопам'яті. Вони, у свою чергу, поділяються на текстові та графічні. При текстових екран розбивається на знакоместа (зазвичай розміром 9×16 точок), а в відеопам'ять вписуються коди символів. За кодом відеоконтролер бере і виводить на екран готову «картинку» символу. Намалювати довільне зображення в текстовому режимі не можна, і тому доводиться задовольнятися лише заздалегідь певним набором символів. При графічних режимах можна управляти кожною точкою екрана, але для цього потрібно набагато більший об'єм відеопам'яті, та й робота займе багато часу.

Графічні режими можуть відрізнятися дозволом (320×200, 640×480, 800×600 пікселів і ін) і числом квітів (2, 4, 16, 256, 65 тис., 16 млн.).

Зворотний хід кадрової розгортки. При відображенні картинки на моніторі промінь в ЕЛТ послідовно пробігає по всіх рядках зверху вниз, а потім вимикається і повертається в початок екрана. Даний процес і називається зворотним ходом кадрової розгортки; він відбувається періодично (70 разів на секунду в режимі 320×200 пікселів і 256 кольорів). У цей час зображення на дисплеї не формується, і тому у відеопам'яті можна робити зміни, не побоюючись, що вони призведуть до появи перешкод на екрані.

Спрайт (sprite) – Невелике зображення, вільно переміщається по монітору. У первинному значенні слова цей термін застосовувався тільки для апаратно виведених зображень. Власне, лише один справжній спрайт можна зустріти на IBM PC – апаратний курсор миші. При архітектурі х86 під спрайтом прийнято розуміти програмно виведене зображення, яке може мати складну форму і пересуватися поверх фону, не затираючи його.

VideoBIOS. BIOS – базова система введення-виведення, що забезпечує проведення елементарних операцій з обслуговування периферії ПК: дискових накопичувачів, клавіатури, монітора та ін Вона являє собою мікросхему ПЗУ, що знаходиться на системній платі комп'ютера. VideoBIOS – розташована на відеоконтролері частина BIOS, що виконує базові функції по роботі з монітором.

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


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

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

Ваш отзыв

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

*

*