Створення гри типу DOOM, Wolf 3D, Детальна інформація

Створення гри типу DOOM, Wolf 3D
Тип документу: Курсова
Сторінок: 3
Предмет: Комп`ютерні науки
Автор: Підгорний Святослав
Розмір: 41.4
Скачувань: 1308
7. Так як же все ж таки отримати таке тривимірне зображення з двовимірної мапи? Просто вираховуючи висоту стін як функцію від відстані. Маючи поточні координати гравця, координати стіни та, використовуючи тригонометрію, ми можемо визначити відстань між гравцем та стіною. Проблема в тому, щоб виконати всі ці розрахунки настільки швидко, щоб гра виглядала реалістично. Але цим ми займемося пізніше. Зараз нехай спрацює простий метод визначення відстані до стіни. При цьому потрібно пам’ятати, що ми проводимо промінь для кожного стовпчика пікселей екрану, що для режиму VGA 13h (320x200x256) дає нам 320 стовпчиків по 200 пікселів. Тобто, 320 променів буде проведено щоб намалювати 1 кадр.

8. Почнемо з заповнення початкових значень для гравця. Як ми вже сказали, кожний квадрат має розміри 64x64 одиниці. Нехай гравець стоїть в клітинці (1, 1) десь на 3/4 клітинки згори та на 1/4 клітинки зліва. Значить координати гравця десь приблизно (80, 112) (64 + 64 * 1/4, 64 + 64 * 3/4). Початковий кут зору буде 0(. Так як ми будемо використовувати тригонометричні функції з бібліотеки мови C, ми будемо використовувати координатну систему, де кут збільшується за годинниковою стрілкою.

9. Тому, як було сказано в пункті 4, ми починаємо проводити промені від 30( зліва від нашого кута зору (=0() (або з 330() до 30( справа від нашого кута зору (або до 30(). Можна побачити правильний трикутник від того місця де стоїть гравець до точки з кутом 330(.

;

, що дорівнює 819.5999 або 820 одиниць. Що ж, 820 це максимальна відстань, на яку ми можемо пустити промінь, переглядаючи по дорозі чи не натрапили ми на стіну або чи не вийшли ми за межі лабіринту. Ми звели проведення променя до малювання лінії. А для малювання лінії у нас є алгоритм Брезенхама. Нам треба тільки визначити координати кінцевих точок лінії. Якщо ми маємо початкові координати гравця (X, Y), тоді використаємо вирази для точок кола щоб взнати кінцеві координати.





Використавши числа з пунктів 8 та 10 отримуємо:





. Передавши параметри (80, 112, 790, -298) в процедуру проведення лінії, що перевіряє зіткнення з стінами. Для кожної точки вздовж лінії ми визнячаємо координати на нашій карті так:



нашого поля зору.

Таблиця висот будується так: для кожної з можливих відстаней висота=відстань/С, де С — коефіцієнт, що вибирається пробним шляхом.

Так ми малюємо один кадр нашої гри. Він залежить від двох параметрів — координат гравця та його кута зору. Змінюючи ці параметри та перемальовуючи екран знову можна отримати те що бачить гравець з новими координатами та/або кутом зору. А самі зміни координат та кута відбуваються в залежності від тих клавіш, що їх натиснув гракець на клавіатурі, або від перевування мишки. Чим більше кадрів малювати за одиницю часу, тим більш плавною і реалістичною буде гра.

Коротше кажучи, ось основні кроки:

Візьміть кут зору гравця і відніміть 30( від нього щоб отримати напрям першого променя.

Вирахуйте координати кінцевої точки використовуючи початкові координати гравця, напрям променя та максимальну відстань, на яку проводиться промінь.

Використовуючи алгоритм лінії Брезенхама, в кожній точці лінії перевіряти, чи не втикнулися ми зі стіною і чи не вийшли ми за межі лабіринту. Якщо знайшли стіну, повернути координати (Wx, Wy) точки перетину.

Використувуючи координати грвця та координати перетину з стіною визначити відстань до стіни.

Використувуючи відстань, визначити з таблиці висот висоту стіни яку треба намалювати.

Додати 0,1875 до кута проведення променя і знову пройти пункти 1-6 доки не намалюємо всі 320 ліній екрану.

11. Описаний вище алгоритм дає більш-менш нормальний результат, але має декілька недоліків:

Швидкість. Проведення 320 ліній для кожного кадру просто дуже повільно. На екрані може бути видно як перемальовується кожен кадр зліва направо.

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

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

long getTime() {

return peek(0, 0x46E)*65535+peek(0, 0x46C);

}

int TimeCounter=0;

The online video editor trusted by teams to make professional video in minutes