СТВОРЕННЯ КОМП’ЮТЕРНОЇ ГРИ З ВИКОРИСТАННЯМ ТЕХНОЛОГІЇ РЕЙКАСТИНГУ
11.05.2022 02:35
[1. Информационные системы и технологии]
Автор: Ковбасюк Остап Володимирович, студент магістратури, Львівський національний університет імені Івана Франка, м. Львів
Актуальність. Сьогодні існує велетенська кількість комп’ютерних ігор різних жанрів. З кожним днем популярність ігор тільки зростає, приходять нові цікаві жанри, використовуються нові технології їхнього створення та відтворення. Ігри розпочинали свою історію у дослідницьких лабораторіях вчених. Були частинами докторських дисертацій та мали надзвичайне практичне значення і цінність. Спочатку ігри були дуже примітивними, але технології не стояли на місці і саме завдяки досягенням у комп’ютерному моделюванні і програмуванні, світ міг побачити розвиток використання різних технологій для реалізації комп’ютерних ігор. Відповідно, актуальністю створення і практичним значенням роботи є надання можливості зіграти у гру, створену з використанням технології рейкастингу для створення псевдо 3d графіки, яка використовувалася ще в дуже ранній епосі зародження 3d ігор та яка на даний момент є забутою.
Метою виконання роботи є створена комп’ютерна гра, яка використовуватиме технологію кидання променів та можливість зіграти в неї з будь-якого пристрою, що має встановлений веб-браузер. Зміст гри – знайти вихід із лабіринту якомога швидше. Гра відноситься до жанру екшн, конкретніше до піджанру гра – лабіринт. Метою створення такого програмного продукту є надання можливості користувачам зіграти у розважальну гру, створену за технологіями, які раніше використовувалися для відтворення псевдо 3d графіки.
Засоби реалізації. Механізм кидання променю і утворення проекції реалізовано наступним чином. З якоїсь початкової точки кидається промінь. Для того аби не шукати через кожну одиницю можливе зіткнення, вводиться інкремент, який визначається з певним кроком по X та У. Цей інкремент визначається для X та У окремо і залежить від розміру самої клітинки та кута кидання променю. Таким чином, поступово інкрементуючи точку ми знайдемо відстань до першого вертикального та/або горизонтального перетинів. Це можна легко побачити випустивши з однієї точки два випадкові промені (рис. 1).
Рис.1. Результат випускання двох променів з однієї точки
Серед обох перетинів одного променю вибирається те, що є ближчим до його початку. Таким чином ми отримуємо реальну точку зіткнення зі стіною. Далі вираховуємо висоту стіни, згідно з отриманою відстанню променя та початковим заданим співвідношенням довжини променя до висоти: (початкова висота стіни / відстань до стіни) * початкова відстань до стіни. Дана висота відповідає тільки одному променю, тому виводом на екран буде один вертикальний стовпець вирахуваної висоти. Далі його можна заповнити певним кольором, або ж текстурою. Для цілісності картинки потрібно випустити певну кількість таких променів з деяким градусним кроком. Таким чином, випустивши до прикладу 64 промені з кроком градусу 1, ми отримуємо стільки ж вертикальних стовпців, після заповнення кольором та масштабування яких, вже вимальовується повноцінна проекція стін на карті (рис. 2). Також, в грі застосовується алгоритм бектрекінгу, для створення рівня (випадкової генерації лабіринту).
Висновки. Було розроблено програмний продукт – комп’ютерну гру, з використанням технології рейкастингу. Розробку було розпочато зі створення основної логіки гри, яка складається з 3 складових: рівень, промінь та гравець.
Рис. 2. Приклад утвореного зображення
Задача класу рівня – це випадкова його генерація та задання кінцевої точки виходу.
Наступним є клас променю. Його основна задача – це реалізація алгоритму кидання променю, промальовування на карті та 3d рендер на основі отриманих результатів з обчислень.
Наступним є клас гравця. Його основна задача – промальовування гравця на карті надання можливості переміщення та використання променів, для оновлення позиції та кутів для кидання променю і 3d рендерингу відносно положення гравця відповідно.
В результаті реалізації і комбінування цих трьох класів, було отримано кістяк ігрового процесу.