Реферат: Створення гри типу DOOM Wolf 3D
Використавши числа з пунктів 8 та 10 отримуємо:
що дає: . Передавши параметри (80, 112, 790, -298) в процедуру проведення лінії, що перевіряє зіткнення з стінами. Для кожної точки вздовж лінії ми визнячаємо координати на нашій карті так:
Поглянувши знову на малюнок 1 ми бачимо що наше перше зіткнення з стіною відбувається у клітинці (2, 0). Тепер визначимо відстань до цієї стіни. Назвемо точку перетину з стіною W, щоб не сплутати її з точкою кінця відрізка. Відстань визначається так: , . З малюнку видно, що стіна знаходиться десь в (128, 128) в квадраті (2, 0) тому: , з чого виплаває, що відстань = 50.596 або приблизно 51 одиниці. Знаючи відстань ми, заглянувши в таблицю висот, можемо взнати висоту стіни і намалювати одну горизонтальну лінію на екрані визначеної висоти. Продовжуємо цей процес для всіх колонок на екрані (320), де кожна колонка відповідає віддалі до стіни, і заповнюємо весь екран. Як ви мабуть і здогадуєтесь, ми не будемо зменшувати наш кут по цілому градусу, а по ° що дорівнює 0,1875°. 320 стовпчиків по 0,1875° дає нашого поля зору.
Таблиця висот будується так: для кожної з можливих відстаней висота=відстань/С, де С — коефіцієнт, що вибирається пробним шляхом.
Так ми малюємо один кадр нашої гри. Він залежить від двох параметрів — координат гравця та його кута зору. Змінюючи ці параметри та перемальовуючи екран знову можна отримати те що бачить гравець з новими координатами та/або кутом зору. А самі зміни координат та кута відбуваються в залежності від тих клавіш, що їх натиснув гракець на клавіатурі, або від перевування мишки. Чим більше кадрів малювати за одиницю часу, тим більш плавною і реалістичною буде гра.
Коротше кажучи, ось основні кроки:
1. Візьміть кут зору гравця і відніміть 30° від нього щоб отримати напрям першого променя.
2. Вирахуйте координати кінцевої точки використовуючи початкові координати гравця, напрям променя та максимальну відстань, на яку проводиться промінь.
3. Використовуючи алгоритм лінії Брезенхама, в кожній точці лінії перевіряти, чи не втикнулися ми зі стіною і чи не вийшли ми за межі лабіринту. Якщо знайшли стіну, повернути координати (Wx, Wy) точки перетину.
4. Використувуючи координати грвця та координати перетину з стіною визначити відстань до стіни.
5. Використувуючи відстань, визначити з таблиці висот висоту стіни яку треба намалювати.
6. Додати 0,1875 до кута проведення променя і знову пройти пункти 1-6 доки не намалюємо всі 320 ліній екрану.
11. Описаний вище алгоритм дає більш-менш нормальний результат, але має декілька недоліків:
1. Швидкість. Проведення 320 ліній для кожного кадру просто дуже повільно. На екрані може бути видно як перемальовується кожен кадр зліва направо.
2. Перетини. Немає простого способу визначити з якою саме чистиною стіни перетнувся наш промінь, а тому важко на стіни накласти текстуру.
Для точнішого визначення швидкості роботи описаного алгоритму (в кадрах за секунду), були написані відповідні процедури. Ось основна схема визначення кількості кадрів за секунду.
long getTime() {
return peek(0, 0x46E)*65535+peek(0, 0x46C);
int TimeCounter=0;
void main(void) {
long RememberTheTime=getTime();
int FramesPerSecond=0;
while (TRUE) {
TimeCounter++;
if (getTime()-RememberTheTime>=18) {
FramesPerSecond=TimeCounter;