Please use this identifier to cite or link to this item:
https://er.chdtu.edu.ua/handle/ChSTU/9038| Title: | Програмне забезпечення розвиваючої гри "Butterfly |
| Authors: | Метелап, Володимир Володимирович Гладкий, Владислав Михайлович |
| Issue Date: | 20-Jun-2024 |
| Abstract: | АНОТАЦІЯ
Гладкий Владислав Михайлович, представляю кваліфікаційну роботу
бакалавра на тему: «ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ КОМП'ЮТЕРНОЇ ГРИ
BUTTERFLY» за спеціальностю «121 – Інженерія програмного забезпечення» в
Черкаському державному технологічному університеті в м.Черкаси в 2024 році.
Дана робота бакалавра присвячена аналізу та розробці програмного
забезпечення для обробки зображень з використанням бібліотеки PyGame,
Numpy та мови програмування Python. Вона включає огляд існуючих досліджень
у даній галузі, аналіз потреб та вимог цільової аудиторії, розробку архітектури
програми, розробку функцій і алгоритмів роботи, тестування та оцінку
результатів.
Головні завдання:
1 Інформаційний пошук методів та засобів розв’язання заданих задач.
2 Конструювання програмного забезпечення інформаційної системи
модуль редактора зображень для фотографа любителя.
3 Проєктування програмного забезпечення інформаційної системи модуль
редактора зображень для фотографа любителя.
4 Тестування та ліквідація недоліків програмного забезпечення.
5 Провадження та супроводження програмного забезпечення.
У роботі використовуються сучасні техніки та методи програмування, такі
як мова програмування Python, бібліотека Pygame,Numpy для обробки зображень
та інші необхідні інструменти та техніки.
Основним результатом цієї роботи є розробка програмного забезпечення,
яке надає користувачам комп’ютерну гру, яка буде працювати, та розважати
своїх користувачів.
Розроблена програма є чудовим методом добре провести вільний час. ANNOTATION Gladkyi Vladyslav Mykhailovych presents the bachelor’s qualification work on the topic: ―SOFTWARE FOR THE BUTTERFLY COMPUTER GAME‖ for the specialty ―121 – Software Engineering‖ at the Cherkasy State Technological University in Cherkasy in 2024. This bachelor’s thesis is dedicated to the analysis and development of software for image processing using the PyGame library, Numpy, and the Python programming language. It includes a review of existing research in this field, analysis of the needs and requirements of the target audience, software architecture development, functionality and algorithm development, testing, and result evaluation. Main tasks: 1. Information search for methods and tools to solve the given tasks. 2. Designing software for the image editor module of an information system for amateur photographers. 3. Developing software for the image editor module of an information system for amateur photographers. 4. Testing and debugging the software. 5. Implementation and maintenance of the software. The work uses modern programming techniques and methods, such as the Python programming language, the Pygame library, Numpy for image processing, and other necessary tools and techniques. The main result of this work is the development of software that provides users with a computer game that operates and entertains its users. The developed program is an excellent method for spending free time well. |
| URI: | https://er.chdtu.edu.ua/handle/ChSTU/9038 |
| Appears in Collections: | 121 Інженерія програмного забезпечення (Інженерія програмного забезпечення) |
Files in This Item:
| File | Description | Size | Format | |
|---|---|---|---|---|
| Кваліфікаційна робота бакалавра Гладкий Владислав Михайлович.pdf Restricted Access | 2.18 MB | Adobe PDF | View/Open Request a copy |
Items in DSpace are protected by copyright, with all rights reserved, unless otherwise indicated.
Extracted text
ЧДТУ.24 2211.002ПЗ
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
ЧЕРКАСЬКИЙ ДЕРЖАВНИЙ ТЕХНОЛОГІЧНИЙ УНІВЕРСИТЕТ
Факультет інформаційних технологій і систем
Кафедра програмного забезпечення автоматизованих систем
ПОЯСНЮВАЛЬНА ЗАПИСКА
до кваліфікаційної роботи
бакалавра
на тему: «ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ КОМП'ЮТЕРНОЇ ГРИ
BUTTERFLY»
Виконав: студент 4 курсу, групи ПЗ-2004
спеціальності
121 «Інженерія програмного забезпечення»
(шифр і назва напряму підготовки)
Студент Гладкий В.М.
(прізвище та ініціали)
Керівник Метелап В.В.
(прізвище та ініціали)
Рецензент
(прізвище та ініціали)
Черкаси 2024
5
ЧДТУ.24 2211.002ПЗ
АНОТАЦІЯ
Гладкий Владислав Михайлович, представляю кваліфікаційну роботу
бакалавра на тему: «ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ КОМП'ЮТЕРНОЇ ГРИ
BUTTERFLY» за спеціальностю «121 – Інженерія програмного забезпечення» в
Черкаському державному технологічному університеті в м.Черкаси в 2024 році.
Дана робота бакалавра присвячена аналізу та розробці програмного
забезпечення для обробки зображень з використанням бібліотеки PyGame,
Numpy та мови програмування Python. Вона включає огляд існуючих досліджень
у даній галузі, аналіз потреб та вимог цільової аудиторії, розробку архітектури
програми, розробку функцій і алгоритмів роботи, тестування та оцінку
результатів.
Головні завдання:
1 Інформаційний пошук методів та засобів розв’язання заданих задач.
2 Конструювання програмного забезпечення інформаційної системи
модуль редактора зображень для фотографа любителя.
3 Проєктування програмного забезпечення інформаційної системи модуль
редактора зображень для фотографа любителя.
4 Тестування та ліквідація недоліків програмного забезпечення.
5 Провадження та супроводження програмного забезпечення.
У роботі використовуються сучасні техніки та методи програмування, такі
як мова програмування Python, бібліотека Pygame,Numpy для обробки зображень
та інші необхідні інструменти та техніки.
Основним результатом цієї роботи є розробка програмного забезпечення,
яке надає користувачам комп’ютерну гру, яка буде працювати, та розважати
своїх користувачів.
Розроблена програма є чудовим методом добре провести вільний час.
5
ЧДТУ.24 2211.002ПЗ
6
ЧДТУ.24 2211.002ПЗ
ANNOTATION
Gladkyi Vladyslav Mykhailovych presents the bachelor’s qualification work on
the topic: ―SOFTWARE FOR THE BUTTERFLY COMPUTER GAME‖ for the
specialty ―121 – Software Engineering‖ at the Cherkasy State Technological
University in Cherkasy in 2024.
This bachelor’s thesis is dedicated to the analysis and development of software
for image processing using the PyGame library, Numpy, and the Python
programming language. It includes a review of existing research in this field, analysis
of the needs and requirements of the target audience, software architecture
development, functionality and algorithm development, testing, and result evaluation.
Main tasks:
1. Information search for methods and tools to solve the given tasks.
2. Designing software for the image editor module of an information system
for amateur photographers.
3. Developing software for the image editor module of an information system
for amateur photographers.
4. Testing and debugging the software.
5. Implementation and maintenance of the software.
The work uses modern programming techniques and methods, such as the
Python programming language, the Pygame library, Numpy for image processing, and
other necessary tools and techniques. The main result of this work is the development
of software that provides users with a computer game that operates and entertains its
users.
The developed program is an excellent method for spending free time well.
7
ЧДТУ.24 2211.002ПЗ
Черкаський державний технологічний університет
повне найменування вищого навчального закладу
Факультет інформаційних технологій і систем
Кафедра програмного забезпечення автоматизованих систем
Освітній рівень бакалавр
Спеціальність 121 «Інженерія програмного забезпечення»
Освітня програма Інженерія програмного забезпечення
ЗАТВЕРДЖУЮ
Зав. кафедри ПЗАС, професор
Голуб_С.В__________________
«___» _____________ 2024 року
З А В Д А Н Н Я
НА КВАЛІФІКАЦІЙНУ РОБОТУ СТУДЕНТУ
Гладкий Владислав Михайлович
(прізвище, ім’я, по батькові)
1. Тему проекту (роботи) «ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ КОМП'ЮТЕРНОЇ ГРИ
BUTTERFLY»
Керівник проекту (роботи) Метелап Володимир Володимирович к.т.н. доцент
(прізвище, ім’я , по батькові, науковий ступінь, вчене звання)
Затверджені наказом Черкаського державного технологічного університету від « 26 » лютого 2024
року №60/04
2. Строк подання студентом проекту (роботи) 31.05.2024
3. Вхідні дані до проекту (роботи) стандарти програмного забезпечення; процеси управління;
вимоги до проекту; календарне планування проекту; управління ризиками проекту; управління
ресурсами
4. Зміст розрахунково-пояснювальної записки (перелік питань, які потрібно розробити) Вступ;
Існуючі методи та засоби вирішення поставлених завдань; Впровадження результатів досліджень
у практику; Проектування програмного забезпечення інформаційних систем; Розробка та
тестування програмного забезпечення; Висновки; Список використаних джерел;
Додатки.
5. Перелік графічного матеріалу (з точним зазначенням обов’язкових робіт проекту)
Слайд 1, Слайд 2, Слайд 4, Слайд 5, Слайд 6, Слайд 7, Слайд 8, Слайд 9, Слайд 10, Слайд 11,
Слайд 12, Слайд 13, Слайд 14, Слайд 15
6. Консультанти розділів роботи
Прізвище, ініціали та Підпис, дата
Розділ
посади консультанта Завдання видав Завдання прийняв
1
2
8
ЧДТУ.24 2211.002ПЗ
7. Дата видачі завдання 02 грудня 2023 р
КАЛЕНДАРНИЙ ПЛАН
Строк виконання
№ етапів
Назва етапів випускної роботи Примітки
п/п кваліфікаційної
роботи
1 Постановка задачі 02.12.2023 виконано
2 Підготовка завдання 10.12.2023 виконано
3 Погодження завдання 25.12.2023 виконано
4 Затвердження завдання 12.01.2024 виконано
Основна стадія
1 Підбір матеріалів 28.01.2024 виконано
2 Аналіз шляхів вирішення поставлених задач 15.02.2024 виконано
3 Розрахунок основних параметрів роботи 02.03.2024 виконано
4 Вибір кінцевого варіанту проектного рішення 21.03.2024 виконано
5 Оформлення первісної редакції роботи 20.04.2024 виконано
Заключна стадія
1 Узгодження прийнятих проектних рішень з керівником 03.05.2024 виконано
2 Оформлення пояснювальної записки роботи в кінцевій 10.05.2024 виконано
редакції
3 Попередній захист роботи 29.05.2024 виконано
4 Затвердження роботи 11.06.2024 виконано
5 Рецензування роботи 11.06.2024 виконано
6 Захист роботи виконано
Студент _____________________ Гладкий В.М
(підпис) (прізвище та ініціали)
Керівник роботи _____________________ Метелап В.В.
(підпис) (прізвище та ініціали)
5
ЧДТУ.24 2211.002ПЗ
5
ЧДТУ.24 2211.002ПЗ
6
ЧДТУ.24 2211.002ПЗ
ВСТУП
Актуальність теми: Актуальність теми визначається потребою у розробці
програмного забезпечення для створення тривимірних ігор із використанням
алгоритмів трасування променів (Ray Casting). Це є однією з важливих тем у
сучасній комп'ютерній графіці та розробці ігор, оскільки такі алгоритми
дозволяють створювати реалістичні та захоплюючі візуальні ефекти навіть на
обмежених апаратних ресурсах. Реалізація цих алгоритмів із застосуванням
популярних бібліотек, таких як Pygame і Numba, дозволяє розробникам глибше
зрозуміти принципи роботи графічних систем і покращити свої навички
програмування.
Мета розробки: Метою роботи є розробка програмного забезпечення
інформаційної технології, яка демонструє можливості алгоритму трасування
променів для візуалізації тривимірного простору у двовимірній площині,
використовуючи мову програмування Python і бібліотеки Pygame та Numba.
Завдання розробки: Ознайомитися з основними принципами роботи
алгоритму трасування променів.
Розробити структуру програми, яка включає в себе модулі для обробки
карти світу, управління гравцем, відображення об'єктів та анімації.
Реалізувати механізми взаємодії гравця з об'єктами та NPC (негравими
персонажами).
Створити візуально привабливе меню для початкового запуску гри.
Забезпечити коректну роботу гри на різних платформах та з різними
роздільними здатностями екрану.
Об’єкт розробки: Об'єктом розробки є програмне забезпечення для
комп’ютерної гри ―Butterfly‖ Цей додаток призначений для тривимірної гри з
використанням алгоритму трасування променів.
Предмет розробки: Предметом розробки є алгоритми та програмні засоби
для реалізації тривимірної графіки на основі алгоритму трасування променів,
управління об'єктами та взаємодії з гравцем.
5
ЧДТУ.24 2211.002ПЗ
Методи проектування та конструювання: Проєктування та
конструювання гри здійснювалося з використанням модульного підходу, де
кожен модуль відповідає за певну функціональність: обробка карти світу,
управління гравцем, відображення об'єктів, анімація, обробка колізій та
інтерфейс користувача. Такий підхід дозволяє розділити розробку на логічні
частини, що значно спрощує процес тестування, налагодження та подальшого
розширення функціональності гри.
Основні методи включають використання бібліотеки Pygame для
відображення графіки та обробки подій, а також бібліотеки Numba для
оптимізації обчислень трасування променів. Використання Pygame забезпечує
простий доступ до засобів для створення віконного інтерфейсу, обробки подій
введення з клавіатури та миші, а також для відтворення звуків та музики.
Бібліотека Numba дозволяє прискорити виконання обчислень завдяки
компіляції Python-коду в машинний код. Це особливо важливо при виконанні
обчислювально інтенсивних завдань, таких як трасування променів, де кожен
промінь повинен обчислюватися швидко для забезпечення плавного рендерингу
графіки.
Окрім цього, в проєкті використовувалися такі методи та підходи:
Обробка карти світу: Створення та управління картою світу здійснювалося
за допомогою двовимірної матриці, де кожна клітинка відповідає певному типу
об'єкта (стіна, підлога, об'єкт декору). Це дозволило легко обробляти та
змінювати карту світу.
Управління гравцем: Для управління рухом та діями гравця були
використані об'єктно-орієнтовані підходи. Клас Player обробляє введення з
клавіатури та миші, виявляє колізії та оновлює стан гравця.
Відображення об'єктів та анімація: Об'єкти в грі представлені класом
SpriteObject, який обробляє їхнє відображення, анімації, взаємодію з гравцем та
інші дії. Клас Drawing відповідає за малювання всіх елементів на екрані,
включаючи фон, стіни, об'єкти та міні-карту.
Обробка колізій: Колізії між гравцем та об'єктами, а також між об'єктами і
6
ЧДТУ.24 2211.002ПЗ
іншими елементами світу, обробляються методами класу Player. Це включає в
себе перевірку на зіткнення та коригування руху гравця.
Інтерфейс користувача: Гра містить початкове меню, яке дозволяє гравцю
почати гру або вийти з неї. Інтерфейс створюється за допомогою текстових
елементів та кнопок, реалізованих у класі Drawing.
Такий підхід до проєктування та конструювання гри забезпечує гнучкість і
модульність, що дозволяє легко розширювати функціональність гри, додаючи
нові модулі або змінюючи існуючі.
Опис отриманих результатів. У результаті розробки було створено гру,
яка дозволяє гравцю пересуватися тривимірним простором, взаємодіяти з
об'єктами та NPC, а також отримувати візуальні ефекти, що забезпечуються
алгоритмом трасування променів. Гра містить початкове меню, в якому можна
почати гру або вийти з неї.
Практичне значення досягнутих результатів. Досягнуті результати
можуть бути використані як основа для подальшого вивчення та розробки
складніших тривимірних ігор. Вони демонструють ефективні методи реалізації
тривимірної графіки за допомогою алгоритму трасування променів, що дозволяє
створювати реалістичні сцени навіть на обмежених апаратних ресурсах. Це
відкриває можливості для розробки ігор на пристроях із середньою та низькою
продуктивністю, таких як мобільні телефони та планшети.
Знання та навички, отримані під час цієї розробки, можуть бути
застосовані в інших проєктах, пов'язаних із комп'ютерною графікою, іграми та
симуляціями. Наприклад, методи оптимізації обчислень, використання
бібліотеки Numba для прискорення коду, а також принципи роботи з бібліотекою
Pygame можуть бути корисними в будь-яких проєктах, де важлива швидкодія та
ефективне управління ресурсами.
Окрім того, цей проєкт може служити навчальним посібником для
студентів і початківців у сфері розробки ігор, демонструючи принципи
модульного програмування, роботи з двовимірними та тривимірними об'єктами,
а також обробки подій і взаємодії з користувачем. Практичне значення також
7
ЧДТУ.24 2211.002ПЗ
полягає в тому, що розробка такого проєкту сприяє розвитку алгоритмічного
мислення та навичок вирішення складних задач, що є важливими для
професійного зростання в IT-індустрії.
Досягнуті результати можуть також бути корисними для розробки
симуляційних програм, віртуальних турів та інших додатків, де важливо
створити ілюзію тривимірного простору. Це відкриває нові можливості для
використання тривимірної графіки у навчанні, медицині, архітектурі та інших
галузях, де візуалізація складних об'єктів і середовищ може покращити
розуміння та взаємодію користувачів з цифровими продуктами.
8
ЧДТУ.24 2211.002ПЗ
РОЗДІЛ 1 ІСНУЮЧІ МЕТОДИ ТА ЗАСОБИ РОЗВ’ЯЗАННЯ
ПОСТАВЛЕНИХ ЗАВДАНЬ
1.1 Аналіз існуючих методів та засобів вирішення задачі
У сучасній комп'ютерній графіці та розробці ігор існує кілька підходів до
створення тривимірних сцен на двовимірній площині. Основними методами є
алгоритми трасування променів (Ray Casting), методи растеризації та інші
підходи, що використовують різноманітні техніки обробки графіки. Кожен з цих
методів має свої переваги та недоліки, що залежать від вимог до продуктивності,
реалістичності зображення та апаратних ресурсів.
Алгоритми трасування променів
Алгоритми трасування променів є одними з найпоширеніших методів для
рендерингу тривимірних сцен. Вони працюють шляхом відстеження шляхів
світлових променів від спостерігача (камери) до об'єктів у сцені. Ці алгоритми
забезпечують високий рівень реалістичності зображення, зокрема для складних
ефектів освітлення та тіней. Основні переваги трасування променів включають:
Реалістичне освітлення та тіні.
Правильне відображення дзеркальних поверхонь.
Обробка прозорих матеріалів.
Можливість моделювання складних оптичних явищ, таких як заломлення,
каустика та глибокі тіні.
Недоліками трасування променів є висока обчислювальна складність та
вимоги до апаратних ресурсів, що може обмежувати його використання на
пристроях із середньою та низькою продуктивністю. Для зниження
навантаження можуть використовуватися різні методи оптимізації, такі як
адаптивне трасування, використання просторових структур даних (наприклад,
BSP-дерев або KD-дерев) та багатопоточність.
Методи растеризації
Методи растеризації є альтернативою трасуванню променів і
використовуються в більшості сучасних графічних процесорів (GPU). Вони
9
ЧДТУ.24 2211.002ПЗ
працюють шляхом проєктування тривимірних об'єктів на двовимірну площину та
визначення кольору кожного пікселя на основі положення об'єкта та освітлення.
Основні переваги методів растеризації включають:
Висока швидкодія та продуктивність.
Широке використання в апаратурі графічних процесорів.
Підтримка складних ефектів за допомогою шейдерів.
Можливість відображення великої кількості об'єктів в реальному часі.
Недоліками методів растеризації є складність у досягненні високого рівня
реалістичності зображення, особливо для складних ефектів освітлення та тіней.
Для подолання цих обмежень можуть використовуватися додаткові техніки, такі
як тіньові карти, нормальні мапи, шейдери пост-обробки та інші методи, що
покращують візуальну якість.
Інші методи
Існують також інші методи, які використовуються для рендерингу
тривимірних сцен, зокрема гібридні методи, що поєднують переваги трасування
променів та растеризації, а також методи глобального освітлення та фотонного
мепінгу. Ці методи дозволяють досягти високого рівня реалістичності
зображення, але зазвичай потребують значних обчислювальних ресурсів.
Наприклад, глобальне освітлення враховує вплив всіх об'єктів сцени один на
одного, що дозволяє створювати дуже реалістичні сцени з природними ефектами
розсіювання світла.
Гібридні методи можуть використовувати растеризацію для початкового
рендерингу сцени та трасування променів для обробки складних ефектів, таких
як відбиття та прозорість. Це дозволяє досягти високої продуктивності без
значної втрати якості зображення.
Використання бібліотек для оптимізації обчислень
У контексті нашої розробки важливим аспектом є використання бібліотек
для оптимізації обчислень. Бібліотека Numba дозволяє компілювати Python-код у
машинний код, що значно прискорює виконання обчислювально інтенсивних
задач. Це особливо важливо для алгоритмів трасування променів, де кожен
10
ЧДТУ.24 2211.002ПЗ
промінь повинен обчислюватися швидко для забезпечення плавного рендерингу
графіки. Оптимізація за допомогою Numba включає використання специфічних
інструкцій процесора, паралельне виконання та ефективне використання кешу.
Бібліотека Pygame забезпечує простий доступ до засобів для створення
віконного інтерфейсу, обробки подій введення з клавіатури та миші, а також для
відтворення звуків та музики. Використання Pygame спрощує розробку ігрових
додатків та дозволяє швидко прототипувати та тестувати різні аспекти гри.
Pygame надає широкий спектр інструментів для роботи з графікою, звуком та
подіями, що дозволяє створювати інтерактивні ігри та симуляції.
Модульний підхід у розробці
Застосування модульного підходу дозволяє розділити розробку гри на
окремі частини, кожна з яких відповідає за певний аспект гри. Це дозволяє легко
розширювати функціональність гри, додавати нові можливості та оптимізувати
існуючі компоненти. Модульність також сприяє поліпшенню якості коду та
спрощує процес тестування та налагодження.
Таким чином, для розв'язання поставлених задач було обрано алгоритм
трасування променів у поєднанні з бібліотеками Pygame та Numba. Це дозволяє
досягти високого рівня реалістичності зображення та ефективної обробки
обчислювально інтенсивних задач, що є ключовими вимогами для нашої гри.
Такий підхід забезпечує високу продуктивність та якість зображення, що є
важливими критеріями для сучасних ігор та інтерактивних додатків.
1.2 Аналіз існуючих аналогів програми
У сфері комп'ютерних ігор існує безліч аналогів, які використовують подібні
методи та техніки для створення тривимірних сцен та геймплею. Однією з
найвідоміших ігор, що застосовує алгоритм трасування променів для рендерингу
тривимірного простору, є класична гра DOOM від компанії id Software. Ця гра,
випущена у 1993 році, стала революційною в галузі комп'ютерних ігор завдяки
своїй інноваційній графіці та швидкій динаміці. Розглянемо деякі ключові
особливості DOOM та інших подібних ігор, які можуть служити аналогами для
11
ЧДТУ.24 2211.002ПЗ
нашого проєкту. Аналіз існуючих аналогів показує, що багато успішних ігор
використовують подібні техніки для створення тривимірних сцен на двовимірній
площині. Вони використовують алгоритми трасування променів або
рейкастингу, текстури та спрайти для відображення об'єктів, а також
інтерактивні елементи для підвищення занурення в ігровий процес. Наш проєкт,
заснований на алгоритмі трасування променів, бібліотеках Pygame та Numba, має
всі шанси стати успішним, враховуючи досвід і напрацювання цих класичних
ігор. Використання сучасних інструментів та методів дозволить досягти високої
якості зображення та продуктивності, що є важливими критеріями для створення
привабливої та захоплюючої гри.
Програмне забезпечення DOOM
DOOM стала однією з перших ігор, що застосувала алгоритм трасування
променів для створення тривимірних ефектів на двовимірному екрані. Головні
особливості DOOM включають:
Алгоритм трасування променів: DOOM використовує спрощений алгоритм
трасування променів для обчислення видимості стін та об'єктів у тривимірному
просторі. Це дозволяє відображати складні сцени з різними рівнями висоти,
обертаннями та пересуванням. Алгоритм трасування променів у DOOM
забезпечує високу швидкість рендерингу, що є критично важливим для
підтримки плавного ігрового процесу.
Текстури та спрайти: Гра використовує двовимірні текстури для стін та
спрайтів для ворогів, об'єктів і зброї. Це забезпечує високу продуктивність і
дозволяє створювати деталізовані сцени без значних обчислювальних витрат.
Використання текстур і спрайтів дозволяє створювати візуально привабливі
сцени з обмеженими ресурсами.
Динамічний геймплей: DOOM відома своєю швидкою динамікою,
інтенсивними боями та захоплюючим геймплеєм. Гравець має можливість вільно
пересуватися рівнями, знаходити секрети та боротися з різноманітними
ворогами. Це створює захоплюючу атмосферу та підтримує інтерес гравця
протягом всієї гри.
12
ЧДТУ.24 2211.002ПЗ
Модульна структура рівнів: Рівні в DOOM створюються за допомогою
спеціального редактора, що дозволяє легко додавати нові карти та модифікації.
Це сприяє активному розвитку спільноти моддерів та розширює можливості гри
за рахунок користувацьких модифікацій.
Переваги DOOM
Висока продуктивність: Використання спрощеного алгоритму трасування
променів та двовимірних текстур забезпечує високу швидкість рендерингу, що є
критично важливим для плавного ігрового процесу.
Гнучкість модифікацій: Модульна структура рівнів і наявність редактора
дозволяє легко створювати нові карти та модифікації, сприяючи активному
розвитку спільноти моддерів.
Захоплюючий геймплей: Динамічний геймплей з інтенсивними боями та
можливістю знаходити секрети забезпечує високу залученість гравців.
Візуальна привабливість: Використання текстур та спрайтів дозволяє
створювати деталізовані сцени з обмеженими ресурсами.
Недоліки DOOM
Обмежена реалістичність: Спрощений алгоритм трасування променів не
забезпечує повну реалістичність освітлення та тіней у порівнянні з більш
сучасними методами.
Фіксовані текстури та спрайти: Використання двовимірних текстур і
спрайтів обмежує можливості для створення складніших тривимірних моделей.
Лінійність рівнів: Незважаючи на модульну структуру, рівні в DOOM часто
мають лінійний характер, що може обмежувати свободу гравця.
В цілому, DOOM стала піонером у використанні алгоритму трасування
променів для створення тривимірних ефектів на двовимірному екрані. Завдяки
високій продуктивності, гнучкості модифікацій, захоплюючому геймплею та
візуальній привабливості, DOOM залишається популярною і до сьогодні.
Незважаючи на деякі обмеження у реалістичності та складності моделей,
досягнення DOOM у створенні динамічного та привабливого ігрового процесу
роблять її важливим орієнтиром для розробників ігор. У нашому проєкті ми
13
ЧДТУ.24 2211.002ПЗ
будемо враховувати ці переваги та недоліки, щоб створити сучасну гру з
використанням алгоритму трасування променів та сучасних технологій, таких як
Pygame та Numba, що дозволить досягти високої якості зображення та
продуктивності. (Рис. 1.1).
Рисунок 1.1 — Інтерфейс програми Doom [24]
Програмне забезпечення Wolfenstein 3D
Ще одним важливим аналогом є гра Wolfenstein 3D, також розроблена
компанією id Software. Випущена у 1992 році, ця гра заклала основу для багатьох
технік, використаних у DOOM:
Рейкастинг: Wolfenstein 3D застосовує алгоритм рейкастингу для
визначення видимості стін та відображення тривимірної сцени на двовимірному
екрані. Рейкастинг є спрощеним варіантом трасування променів і забезпечує
високу швидкість обчислень, необхідну для рендерингу сцен у реальному часі.
Простий дизайн рівнів: Рівні в грі мають просту прямокутну структуру, що
спрощує обробку та рендеринг. Це дозволяє швидко генерувати ігровий простір
14
ЧДТУ.24 2211.002ПЗ
та оптимізувати обчислювальні ресурси для підтримки високої швидкості гри.
Спрайтові вороги та предмети: Гра використовує спрайти для
відображення ворогів, зброї та інших об'єктів. Спрайти дозволяють створювати
деталізовані зображення ворогів і предметів при збереженні високої
продуктивності.
Переваги Wolfenstein 3D
Висока продуктивність: Використання алгоритму рейкастингу забезпечує
швидке обчислення видимості стін, що дозволяє досягти високої швидкості
рендерингу сцен у реальному часі.
Простота реалізації: Простий дизайн рівнів та використання спрайтів
спрощують процес розробки гри, дозволяючи швидко створювати нові рівні та
об'єкти.
Класична атмосфера: Незважаючи на простоту графіки, Wolfenstein 3D
створює захоплюючу атмосферу завдяки цікавому геймплею та ретельно
опрацьованому дизайну рівнів.
Легка модифікація: Прості структури рівнів і спрайтів дозволяють легко
модифікувати гру та створювати нові карти та сценарії, що сприяє активній
спільноті моддерів.
Недоліки Wolfenstein 3D
Обмежена реалістичність: Рейкастинг не забезпечує повної реалістичності
тривимірних сцен, особливо для складних ефектів освітлення та тіней.
Примітивна графіка: Простий дизайн рівнів та використання спрайтів
обмежують візуальну привабливість гри порівняно з сучасними стандартами.
Лінійність рівнів: Простота рівнів може призводити до лінійності
геймплею, що може обмежувати свободу дій гравця та зменшувати
різноманітність ігрових сценаріїв.
Wolfenstein 3D зберігає свою популярність завдяки класичному геймплею
та захоплюючій атмосфері. Цей досвід показує, що навіть з обмеженими
ресурсами можна створити захоплюючу гру, яка залишиться в пам'яті гравців на
довгі роки. Наш проєкт враховуватиме переваги та недоліки Wolfenstein 3D для
15
ЧДТУ.24 2211.002ПЗ
досягнення балансу між продуктивністю, реалістичністю та геймплеєм,
використовуючи сучасні технології та алгоритми.
Рисунок 1.2 — Інтерфейс програми Wolfenstein 3D [15]
1.3 Постановка задачі
На основі проведеного аналізу аналогів, таких як DOOM, Wolfenstein 3D,
було виявлено низку характеристик, які необхідно включити у розробку для
досягнення високої функціональності, зручності користування та продуктивності
програмного забезпечення. Оцінювання аналогів дозволило визначити основні
параметри та критерії, яким повинна відповідати розроблена програма для
забезпечення її конкурентоспроможності та задоволення потреб кінцевих
користувачів.
Основні завдання, які необхідно реалізувати у програмі:
- Високопродуктивний рендеринг та обробка тривимірних сцен:
- реалізація алгоритму трасування променів для забезпечення
реалістичності та швидкості рендерингу.
- використання спрощених алгоритмів (рейкастинг) для підвищення
продуктивності на пристроях з обмеженими ресурсами.
16
ЧДТУ.24 2211.002ПЗ
- оптимізація обчислень за допомогою бібліотеки Numba для
прискорення виконання обчислювально інтенсивних задач.
- Інтерактивний та динамічний геймплей:
- забезпечення швидкої динаміки гри з інтенсивними боями та
можливістю вільного пересування рівнями.
- включення різноманітних типів ворогів та зброї для збагачення
ігрового процесу.
- впровадження інтерактивних елементів, таких як двері, перемикачі
та секрети, для підвищення глибини ігрового процесу.
- Модульна структура рівнів:
- розробка рівнів з використанням модульного підходу, що дозволяє
легко створювати нові карти та модифікації.
- включення спеціального редактора рівнів для спільноти моддерів, що
сприятиме активному розвитку гри та її підтримці.
- Реалістичне відображення об'єктів та анімацій:
- використання текстур та спрайтів для створення деталізованих сцен з
обмеженими ресурсами.
- реалізація анімацій для ворогів, об'єктів та ефектів, таких як вибухи
та постріли, для підвищення реалістичності та динаміки гри.
- Інтуїтивно зрозумілий інтерфейс користувача:
- створення зручної та логічно структурованої навігації для легкого
доступу до основних функцій гри.
- включення інтерактивних підказок та довідкових матеріалів для
користувачів, що допоможуть швидко освоїти гру.
- можливість налаштування інтерфейсу під індивідуальні потреби
користувача.
- Висока продуктивність та стабільність роботи:
- забезпечення швидкого завантаження гри та виконання операцій
рендерингу.
17
ЧДТУ.24 2211.002ПЗ
- оптимізація роботи з великими файлами та високою роздільною
здатністю сцен для підтримки високої продуктивності.
- стабільна робота без збоїв та зависань, що забезпечить позитивний
користувацький досвід.
- Надійність та безпека:
- забезпечення безпечного зберігання даних користувачів та захист від
вірусів та інших шкідливих програм.
- регулярні оновлення для забезпечення актуальності та безпеки
програмного забезпечення.
- Доступність та економічність:
- наявність безкоштовної версії гри для широкого кола користувачів.
- вільний доступ до гри, що дозволить залучити більше користувачів
та створити активну спільноту навколо проєкту.
Реалізація зазначених задач дозволить створити програмний продукт, який
задовольнить потреби користувачів та забезпечить високий рівень
функціональності та зручності використання. Використовуючи досвід та
напрацювання класичних ігор, таких як DOOM та Wolfenstein 3D, наша розробка
буде мати всі шанси стати успішною та популярною серед гравців.
18
ЧДТУ.24 2211.002ПЗ
Висновоки до розділу 1
У першому розділі було проведено аналіз існуючих методів та засобів для
створення тривимірних сцен і геймплею на основі алгоритмів трасування
променів та рейкастингу. Розглянуто ключові особливості та досягнення таких
ігор, як DOOM та Wolfenstein 3D, які стали піонерами у використанні цих
технологій для рендерингу тривимірних сцен на двовимірному екрані.
Аналіз показав, що DOOM та Wolfenstein 3D мають свої переваги і
недоліки. Зокрема, використання спрощених алгоритмів трасування променів та
рейкастингу дозволяє досягти високої швидкості рендерингу та продуктивності,
що є критично важливим для підтримки плавного ігрового процесу. Однак, ці
методи мають обмежену реалістичність, особливо для складних ефектів
освітлення та тіней.
На основі проведеного аналізу були визначені основні завдання для
розробки нашої гри. Основна мета полягає у створенні високо функціональної та
продуктивної гри, яка забезпечить захоплюючий геймплей і буде зручною для
користувачів. Основні завдання включають впровадження ефективних
алгоритмів рендерингу, динамічного геймплею, модульної структури рівнів,
реалістичних анімацій та інтерактивного інтерфейсу користувача.
Проведений аналіз дозволив визначити, які саме характеристики необхідно
включити у розробку, щоб забезпечити її конкурентоспроможність та
задовольнити потреби кінцевих користувачів. Використовуючи досвід та
напрацювання класичних ігор, таких як DOOM та Wolfenstein 3D, розробка буде
мати всі шанси стати успішною та популярною серед гравців.
Таким чином, у першому розділі було закладено теоретичну основу для
подальшої розробки гри, визначено основні вимоги та завдання, які необхідно
реалізувати для досягнення поставлених цілей. Наступні розділи будуть
присвячені детальному опису процесу розробки, реалізації поставлених задач та
оцінці отриманих результатів.
19
ЧДТУ.24 2211.002ПЗ
РОЗДІЛ 2 ВПРОВАДЖЕННЯ РЕЗУЛЬТАТІВ ДОСЛІДЖЕНЬ У
ПРАКТИКУ ПРОЕКТУВАННЯ ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ
ІНФОРМАЦІЙНИХ СИСТЕМ
2.1 Моделювання предметної області.
В даному підрозділі ми розглянемо такі діаграми: діаграма класів,
діаграма пакетів. Розглянемо ці питання більш детальніше.
2.1.1 Предметна область моделювання. Модель предметної області.
Словник предметної області.
Предметна область мого проекту – розробка програмного забезпечення для
гри ―Butterfly‖, орієнтованого на потреби гравців. Предметна область нашої
розробки охоплює створення тривимірних ігор з використанням алгоритмів
трасування променів та рейкастингу. Основні аспекти моделювання включають
графічні об'єкти, логіку гри, інтерфейс користувача та взаємодію між різними
компонентами системи. Ця область моделювання враховує потреби користувачів,
технічні обмеження та вимоги до продуктивності, забезпечуючи таким чином
створення ефективного та привабливого програмного продукту.
Модель предметної області включає такі основні елементи:
Гравець: Основний об'єкт у грі, який взаємодіє з оточуючим світом.
Гравець може переміщатися по рівню, взаємодіяти з об'єктами, атакувати ворогів
і виконувати різні дії. Основні атрибути гравця включають координати,
швидкість руху, стан здоров'я, наявність зброї та інші ігрові параметри.
Вороги: Неграві персонажі (NPC), що взаємодіють з гравцем і можуть мати
різні типи поведінки. Вороги можуть переслідувати гравця, атакувати його,
захищати певні ділянки рівня або виконувати інші завдання. Основні атрибути
ворогів включають координати, стан здоров'я, тип атаки, поведінкові патерни та
інші характеристики.
Об'єкти: Елементи ігрового світу, з якими може взаємодіяти гравець. Це
можуть бути зброя, медичні аптечки, ключі, боєприпаси, перешкоди та інші
20
ЧДТУ.24 2211.002ПЗ
предмети. Кожен об'єкт має свої атрибути, такі як координати, тип, стан та
взаємодія з гравцем або іншими об'єктами.
Рівні: Модулі ігрового світу, що визначають структуру ігрового простору.
Рівні складаються з набору стін, підлог, стель, об'єктів та ворогів, що створюють
певний ігровий сценарій. Рівні можуть мати різні розміри, конфігурації та
тематики.
Інтерфейс користувача: Елементи, що забезпечують взаємодію гравця з
грою. Це включає меню, індикатори здоров'я, інвентар, елементи управління та
інші графічні компоненти, що відображають стан гри та дозволяють гравцю
взаємодіяти з нею. Ця діаграма класів представляє структуру гри включаючи
основні класи та їхні взаємозв'язки (Рис. 2.1).
Рисунок 2.1 – Модель предметної області (діаграма класів) до «програмного
забезпечення комп'ютерної гри butterfly»
Гравець (Player): Керований користувачем персонаж, що взаємодіє з
оточуючим світом.
Атрибути: координати (x, y), швидкість руху, стан здоров'я, наявність
зброї.
Дії: переміщення, атака, взаємодія з об'єктами.
Вороги (Enemies): NPC, які взаємодіють з гравцем і можуть мати різні типи
поведінки.
Атрибути: координати (x, y), стан здоров'я, тип атаки, поведінкові патерни.
Дії: переслідування гравця, атака, захист території.
Об'єкти (Objects): Елементи ігрового середовища, що впливають на
геймплей.
Типи об'єктів: зброя, медичні аптечки, ключі, боєприпаси, перешкоди.
Атрибути: координати (x, y), тип, стан, взаємодія з гравцем.
21
ЧДТУ.24 2211.002ПЗ
Рівень (Level): Окрема карта або частина ігрового світу, що визначає
структуру ігрового простору.
Атрибути: розміри, конфігурація, тематика, набір стін, підлог, стель,
об'єктів, ворогів.
Інтерфейс користувача (UI): Графічні елементи для взаємодії з
користувачем.
Компоненти: меню, індикатори здоров'я, інвентар, елементи управління.
Функції: відображення стану гри, забезпечення взаємодії гравця з грою.
Ця модель предметної області та словник термінів дозволяють детально
описати основні компоненти гри, їх атрибути та взаємодію між ними. Це
забезпечує основу для подальшого проектування та розробки програмного
забезпечення, що відповідає вимогам і очікуванням кінцевих користувачів.
Словник предметної області:
Рисунок 2.2 – Словник предметної області [26]
2.1.2 Елементи моделювання предметної області
Елементи моделювання предметної області охоплюють класи та об'єкти,
що представляють основні компоненти гри. У нашій грі використовується кілька
ключових класів, кожен з яких має свої унікальні атрибути та методи. Ці класи
взаємодіють між собою, утворюючи логічно зв'язану систему.
Гравець (Player)
Клас Player представляє основний об'єкт у грі, яким керує користувач. Цей
клас включає в себе атрибути, що визначають стан гравця, такі як координати,
22
ЧДТУ.24 2211.002ПЗ
швидкість руху, стан здоров'я та наявність зброї. Методи класу забезпечують
можливість переміщення гравця, виконання атак та взаємодію з іншими
об'єктами гри.
Атрибути:
x: int – координата гравця по осі X.
y: int – координата гравця по осі Y.
speed: float – швидкість руху гравця.
health: int – стан здоров'я гравця.
has_weapon: bool – наявність зброї у гравця.
Методи:
move(): void – метод для переміщення гравця.
attack(): void – метод для атаки ворогів.
interact(): void – метод для взаємодії з об'єктами.
Вороги (Enemies)
Клас Enemies представляє негравих персонажів (NPC), які взаємодіють з
гравцем. Вороги можуть мати різні типи поведінки, атакувати гравця та
захищати певні території. Клас включає атрибути, що визначають координати,
стан здоров'я, тип атаки та поведінкові патерни.
Атрибути:
x: int – координата ворога по осі X.
y: int – координата ворога по осі Y.
health: int – стан здоров'я ворога.
attack_type: str – тип атаки ворога.
behavior_pattern: str – поведінковий патерн ворога.
Методи:
chase_player(): void – метод для переслідування гравця.
attack(): void – метод для атаки гравця.
defend_area(): void – метод для захисту території.
Об'єкти (Objects)
Клас Objects представляє різні елементи ігрового середовища, з якими
23
ЧДТУ.24 2211.002ПЗ
може взаємодіяти гравець. Це можуть бути зброя, медичні аптечки, ключі,
боєприпаси, перешкоди та інші предмети. Кожен об'єкт має атрибути, такі як
координати, тип та стан.
Атрибути:
x: int – координата об'єкта по осі X.
y: int – координата об'єкта по осі Y.
type: str – тип об'єкта (зброя, аптечка тощо).
state: str – стан об'єкта.
Методи:
interact_with_player(): void – метод для взаємодії об'єкта з гравцем.
Рівень (Level)
Клас Level представляє окремий модуль ігрового світу, що визначає
структуру ігрового простору. Рівень включає стіни, підлоги, стелі, об'єкти та
ворогів, що створюють певний ігровий сценарій.
Атрибути:
width: int – ширина рівня.
height: int – висота рівня.
theme: str – тематика рівня.
objects: list – список об'єктів на рівні.
enemies: list – список ворогів на рівні.
Методи:
load(): void – метод для завантаження рівня.
render(): void – метод для відображення рівня.
Інтерфейс користувача (UI)
Клас UI представляє графічні елементи, що забезпечують взаємодію гравця
з грою. Інтерфейс включає меню,
2.1.3 Робоча область моделювання
Робоча область моделювання включає в себе створення, тестування та
оптимізацію елементів гри в інтегрованому середовищі розробки (IDE). Основні
24
ЧДТУ.24 2211.002ПЗ
кроки в процесі моделювання включають визначення вимог, проектування
архітектури системи, реалізацію функціональності та інтеграцію різних
компонентів гри.
Вибір інтегрованого середовища розробки (IDE)
Для розробки нашої гри було обрано інтегроване середовище розробки
Visual Studio Code, яке забезпечує зручні інструменти для написання, тестування
та налагодження коду на Python. Visual Studio Code підтримує численні
бібліотеки та фреймворки, що значно спрощує процес розробки.
Структура проекту
Проект має модульну структуру, де кожен модуль відповідає за певну
функціональність. Основні модулі включають:
main.py: Головний модуль, що ініціалізує гру та запускає основний цикл.
player.py: Модуль, що відповідає за логіку управління гравцем.
enemy.py: Модуль, що визначає поведінку ворогів.
object.py: Модуль для різних об'єктів гри.
level.py: Модуль, що відповідає за завантаження та рендеринг рівнів.
ui.py: Модуль, що забезпечує інтерфейс користувача.
ray_casting.py: Модуль, що реалізує алгоритми трасування променів та
рейкастингу.
Процес моделювання
Визначення вимог:
Збір та аналіз вимог до гри, включаючи функціональні та нефункціональні
вимоги.
Визначення цільової аудиторії та сценаріїв використання.
Проектування архітектури:
Розробка UML-діаграм класів для візуалізації структури системи.
Проектування взаємодії між компонентами гри за допомогою діаграм
послідовності та діаграм діяльності.
Реалізація функціональності:
Написання коду для основних класів та методів гри.
25
ЧДТУ.24 2211.002ПЗ
Реалізація алгоритмів трасування променів для рендерингу тривимірних
сцен.
Впровадження механізмів взаємодії гравця з об'єктами та ворогами.
Тестування та налагодження:
Виконання модульних тестів для перевірки коректності роботи окремих
компонентів.
Налагодження коду для виправлення помилок та оптимізації
продуктивності.
Виконання інтеграційних тестів для перевірки взаємодії між різними
модулями.
Інтеграція компонентів:
Об'єднання всіх модулів у єдину систему.
Перевірка коректності роботи гри в цілому.
Оптимізація продуктивності:
Використання бібліотеки Numba для прискорення обчислень.
Оптимізація рендерингу та обробки подій для забезпечення плавного
ігрового процесу.
Документування:
Опис структури проекту та його компонентів.
Підготовка керівництва для користувачів та розробників.
Використання інструментів для моделювання
У процесі моделювання використовуються різні інструменти, що
допомагають у проектуванні та реалізації гри:
PyCharm: Для написання та налагодження коду.
PlantUML: Для створення UML-діаграм класів, послідовності та діяльності.
Numba: Для оптимізації обчислень та підвищення продуктивності.
26
ЧДТУ.24 2211.002ПЗ
Рисунок 2.3 – Модель предметної області до «програмного забезпечення
комп'ютерної гри Butterfly»
2.2 Формування та аналіз вимог
В даному підрозділі ми розглянемо діаграму прецедентів та напишемо
вимоги до створюваної гри. Розглянемо ці питання більш детально.
2.2.1 Формування вимог до програмного забезпечення. Первинні і детальні
вимоги. Вимоги замовника і розробника. Функціональні та нефункціональні
вимоги.
Формування вимог до програмного забезпечення є критично важливим
етапом в процесі розробки, який визначає, які функціональні та нефункціональні
аспекти повинні бути реалізовані для досягнення цілей проекту. Цей процес
включає в себе збір та аналіз вимог від усіх зацікавлених сторін, таких як
замовники, кінцеві користувачі та розробники, для забезпечення того, щоб
програмний продукт відповідав очікуванням і потребам.
В процесі визначення вимог до гри "Butterfly" були враховані як детальні,
так і первинні вимоги, які визначають функціонал, який буде мати створене
програмне забезпечення.
ПЕРВИННІ ВИМОГИ
‒ гра повинна мати зручний та інтуїтивно зрозумілий інтерфейс;
‒ налаштування гри повинні бути гнучкими та зручними для
кoристувача;
‒ гра пoвинна бути швидкoю у викoнанні основних операцій;
‒ програма повинна бути швидкою у виконанні основних операцій;
27
ЧДТУ.24 2211.002ПЗ
‒ функціонал гри повинен дозволяти зберігати прогрес без втрати даних
після обробки.
ДЕТАЛЬНІ ВИМОГИ
‒ продуктивність: гра повинна забезпечувати швидке виконання
основних операцій, що підвищить продуктивність та зменшить час
очікування користувача. Оптимізація використання ресурсів є
критичною для підтримки високої швидкості роботи;
‒ підтримка форматів файлів: Гра повинна підтримувати завантаження та
збереження файлів у різних форматах, таких як JSON для збереження
стану гри. Це забезпечить зручність роботи з різними типами даних і
дозволить легко зберігати та відновлювати прогрес гри;
‒ безпека даних повинна бути гарантована за допомогою сучасних
методів шифрування. Гра повинна відповідати сучасним стандартам
безпеки, щоб захистити конфіденційні дані від несанкціонованого
доступу і забезпечити захист даних користувачів;
‒ гнучкість налаштувань: Налаштування гри повинні бути гнучкими та
зручними для користувача, що дозволить персоналізувати гру
відповідно до його потреб. Користувач повинен мати можливість
змінювати налаштування для адаптації гри під свої вимоги;
‒ регулярні оновлення гри мають бути заплановані для покращення
функціональності, виправлення помилок і підвищення безпеки. Ці
оновлення повинні виконуватися без переривання роботи користувачів
і бути легкими для встановлення;
‒ регулювання графічних налаштувань: Повинна бути реалізована
можливість регулювання графічних налаштувань, що дозволить
користувачам точно налаштовувати графіку відповідно до їхніх потреб.
Вимоги замовника та розробника до гри "Програмне забезпечення гра Butterfly."
можна розподілити на нефункціональні та функціональні вимоги.
ФУНКЦІОНАЛЬНІ ВИМОГИ
Зміна теми інтерфейсу:
28
ЧДТУ.24 2211.002ПЗ
‒ замовник: можливість вибору між темною та світлою темами для
зручності роботи в різних умовах освітлення.
‒ розробник: реалізація функціоналу для зміни теми інтерфейсу з
збереженням вибраних налаштувань.
Регулювання графічних налаштувань:
‒ замовник: можливість точного налаштування графіки гри за допомогою
різних параметрів, таких як яскравість, контраст, деталізація текстур
тощо.
‒ розробник: створення інтерфейсу для регулювання графічних
налаштувань з реальним часом відображенням змін.
Завантаження та збереження файлів:
‒ замовник: підтримка завантаження та збереження файлів у різних
форматах, таких як JSON для збереження стану гри.
‒ розробник: реалізація функцій для завантаження та збереження файлів у
зазначених форматах з відповідними опціями налаштування.
Зміна розміру вікна гри:
‒ замовник: можливість зміни розміру вікна гри для адаптації його до
різних вимог.
‒ розробник: впровадження інструменту для зміни розміру вікна з
можливістю налаштування пропорцій та якості.
Інтерактивний та динамічний геймплей:
‒ наявність динамічних елементів у грі, що забезпечують інтерактивний та
захоплюючий геймплей..
‒ розробник: впровадження механізмів для інтерактивності гри, таких як
вороги, перешкоди, зброя та інші елементи геймплею.
НЕ ФУНКЦІОНАЛЬНІ ВИМОГИ:
Продуктивність:
‒ замовник: забезпечення швидкої обробки даних та миттєвого відгуку
програми.
‒ розробник: оптимізація алгоритмів обробки даних для мінімізації
29
ЧДТУ.24 2211.002ПЗ
затримок під час виконання операцій, забезпечення плавного рендерингу
та швидкої взаємодії з користувачем.
Масштабованість:
‒ замовник: можливість обробляти великі обсяги даних без зниження
продуктивності.
‒ розробник: впровадження механізмів, що дозволяють додавати нові
функції та обробляти більше даних без значного впливу на швидкодію
гри. Забезпечення гнучкості у розширенні функціональності гри.
Надійність:
‒ замовник: стабільна робота гри без збоїв та втрати даних.
‒ розробник: реалізація системи логування та обробки помилок для
забезпечення безперервної роботи гри. Тестування гри для виявлення та
усунення помилок, забезпечення збереження даних у разі
непередбачених ситуацій.
Сумісність:
‒ замовник: підтримка різних операційних систем та пристроїв для
максимальної доступності гри.
‒ розробник: використання кросплатформенних технологій для
забезпечення роботи гри на різних операційних системах та пристроях.
забезпечення сумісності з основними браузерами та мобільними
платформами.
‒ економічність
‒ замовник: доступність гри за розумною ціною або безкоштовно.
‒ розробник: забезпечення доступних варіантів ліцензування гри,
можливість випробування демо-версії. Використання моделей
монетизації, що не заважають ігровому процесу (наприклад,
внутрішньоігрові покупки, реклама).
2.2.2 Формування вимог за допомогою діаграми прецедентів
Формування вимог до програмного забезпечення гри "Butterfly"
30
ЧДТУ.24 2211.002ПЗ
здійснюється за допомогою діаграми прецедентів, яка відображає взаємодію
користувачів із системою та ілюструє основні функціональні можливості
програми. Діаграма прецедентів дозволяє візуалізувати різні сценарії
використання системи, що допомагає краще зрозуміти вимоги до
функціональності.
Основні прецеденти
Гравець:
Запуск гри: Гравець запускає програму і починає гру.
Зміна налаштувань: Гравець змінює налаштування гри, такі як графічні
налаштування, гучність звуку, управління тощо.
Збереження прогресу: Гравець зберігає прогрес у грі.
Завантаження прогресу: Гравець завантажує збережений прогрес.
Гра: Гравець керує персонажем, взаємодіє з об'єктами, б'ється з ворогами.
Перегляд статистики: Гравець переглядає статистику своєї гри, досягнення
та інші метрики.
Завершення гри: Гравець виходить із гри, зберігаючи або не зберігаючи
прогрес.
Адміністратор:
Оновлення гри: Адміністратор забезпечує регулярні оновлення гри, що
включають нові функції, виправлення помилок та підвищення безпеки.
Технічна підтримка: Адміністратор надає технічну підтримку
користувачам гри, вирішує їхні питання та усуває проблеми. Діаграма
прецедентів (Рис. 2.4).
31
ЧДТУ.24 2211.002ПЗ
Рисунок 2.4 – Діаграма прецедентів для гравця до «програмного
забезпечення комп'ютерної гри Butterfly»
2.3 Проектування логічної структури програмного комплексу
В даному підрозділі ми розглянемо такі діаграми: діаграма класів,
діаграма пакетів. Розглянемо ці питання більш детальніше.
2.3.1 Діаграма класів
Діаграма класів відображає статичну структуру системи, показуючи класи,
їх атрибути, методи та взаємозв'язки між ними. Вона допомагає зрозуміти, як
різні компоненти програмного комплексу взаємодіють між собою. Нижче
наведено діаграми класів (Рис.2.5), що відповідає логічній структурі гри
"Butterfly"..
Рисунок 2.5 – Діаграма класів до «програмного забезпечення комп'ютерної гри
Butterfly»
Ця діаграма класів відображає основні класи гри "Butterfly" та взаємозв'язки між
ними. Кожен клас має свої атрибути та методи, які визначають його
функціональність. Взаємодія між класами відображає логічну структуру
програмного комплексу.
Опис класів:
‒ Player: Клас, що представляє гравця в грі. Містить атрибути для зберігання
координат, швидкості та здоров'я гравця. Методи включають переміщення,
атаку та взаємодію з об'єктами.
‒ Enemy: Клас, що представляє ворогів у грі. Містить атрибути для
зберігання координат, здоров'я та типу атаки ворога. Методи включають
переслідування та атаку гравця.
32
ЧДТУ.24 2211.002ПЗ
‒ GameObject: Клас, що представляє об'єкти у грі, з якими може взаємодіяти
гравець. Містить атрибути для зберігання координат та типу об'єкта. Метод
включає взаємодію з гравцем.
‒ Level: Клас, що представляє рівень гри. Містить атрибути для зберігання
розмірів рівня, його тематики, списків об'єктів та ворогів. Методи
включають завантаження та рендеринг рівня.
‒ UI: Клас, що представляє інтерфейс користувача. Містить атрибути для
зберігання меню, індикатора здоров'я та інвентарю. Методи включають
відображення стану гри та оновлення інтерфейсу.
2.3.2 Діаграма пакетів
Діаграма пакетів відображає організацію класів у пакети, що допомагає
структурувати код та забезпечити зрозумілу архітектуру програмного комплексу.
Пакети групують класи за логічними блоками, що спрощує навігацію по коду та
полегшує його підтримку.
Діаграма включає наступний вміст
У цій діаграмі пакетів ми маємо два основних пакети:
Game: Пакет, що містить класи, пов'язані з ігровою логікою, такі як Player,
Enemy, GameObject та Level.
UI: Пакет, що містить клас UI, відповідальний за інтерфейс користувача.
Ця діаграма пакетів допомагає візуалізувати структуру програмного
комплексу, показуючи, як класи згруповані в логічні блоки та як вони
взаємодіють між собою. (Рис. 2.6).
33
ЧДТУ.24 2211.002ПЗ
Рисунок 2.6 – Діаграма пакетів до «програмного забезпечення комп'ютерної гри
Butterfly»
2.4 Архітектурне проектування
В даному підрозділі ми розглянемо архітектурні аспекти проектування
програмного комплексу. Основна увага буде приділена діаграмі компонентів та
діаграмі розгортання, які відображають взаємодію між компонентами системи та
їх розгортання на апаратних засобах.
2.4.1 Діаграма компонентів
Діаграма компонентів показує, як різні частини системи взаємодіють одна з
одною. Це допомагає зрозуміти, як програмний комплекс побудований та як його
компоненти спілкуються між собою. (Рис. 2.7).
34
ЧДТУ.24 2211.002ПЗ
Рисунок 2.7 – Діаграма компонентів до «програмного забезпечення комп'ютерної
гри Butterfly»
Опис компонентів:
‒ Player: компонент, що представляє гравця в грі. Він взаємодіє з об'єктами,
ворогами та рівнем, керується основним компонентом Main.
‒ Enemy: компонент, що представляє ворогів у грі. Взаємодіє з рівнем та
гравцем, керується основним компонентом Main.
‒ GameObject: компонент, що представляє об'єкти у грі. Взаємодіє з рівнем
та гравцем, керується основним компонентом Main.
‒ Level: компонент, що представляє рівень гри. Містить об'єкти, ворогів та
гравця, керується основним компонентом Main.
‒ UI: компонент, що представляє інтерфейс користувача. Відображає
інформацію про гравця та взаємодіє з рівнем, керується основним
компонентом Main.
‒ Main: основний компонент, який забезпечує зв'язок між усіма іншими
компонентами і керує їхньою взаємодією;
‒ ця діаграма компонентів допомагає візуалізувати взаємодію між різними
частинами системи, що полегшує розуміння архітектури гри "Butterfly".
Вона показує, як компоненти гри взаємодіють один з одним та як основний
компонент Main забезпечує координацію їхньої роботи.
2.4.2 Розгортання програмної системи на апаратних засобах. Діаграма
розгортання.
Діаграма розгортання показує, як програмні компоненти розміщені на
апаратних засобах, і відображає фізичну архітектуру системи. Вона допомагає
зрозуміти, які апаратні ресурси використовуються та як компоненти системи
розміщені на цих ресурсах. (Рис. 2.8).
Опис вузлів:
Клієнт: Вузол, що представляє комп'ютер користувача, на якому
запускається гра. Включає компоненти Player, UI, GameObject, Enemy та Level.
35
ЧДТУ.24 2211.002ПЗ
Ці компоненти взаємодіють між собою та з сервером.
Сервер: Вузол, що представляє сервер, на якому знаходиться основний
компонент Main. Сервер забезпечує зв'язок та синхронізацію між усіма іншими
компонентами, обробляючи дані, отримані від клієнтських компонентів.
Ця діаграма показує, як компоненти програмного комплексу "Butterfly"
розгортаються на клієнтських та серверних апаратних засобах. Клієнтська
частина включає компоненти, які забезпечують взаємодію з гравцем та обробку
ігрового процесу, тоді як серверна частина відповідає за координацію та обробку
даних.
Діаграма розгортання допомагає зрозуміти фізичну архітектуру системи та
забезпечує основи для планування та реалізації її розгортання на реальних
апаратних засобах.
Рисунок 2.8 – Діаграма розгортання до «програмного забезпечення комп'ютерної
гри Butterfly»
2.5 Моделювання поведінки системи
В даному підрозділі ми розглянемо діаграми, які відображають динамічні
аспекти роботи системи. До таких діаграм належать діаграма діяльності, діаграма
послідовності, діаграма комунікації та діаграма скінченного автомату. Ці
діаграми допоможуть зрозуміти, як компоненти системи взаємодіють між собою
під час виконання різних процесів.
2.5.1 Діаграма діяльності
36
ЧДТУ.24 2211.002ПЗ
Діаграма діяльності показує потік управління або дій у системі. Вона
відображає послідовність дій, які виконуються для досягнення певної мети.
Нижче наведено UML діаграму для створення діаграми діяльності, що описує
процес запуску гри. (Рис. 2.9).
Рисунок 2.9 – Діаграма діяльності до «програмного забезпечення комп'ютерної
гри Butterfly»
2.5.2 Діаграма послідовності
Діаграма послідовності показує, як об'єкти взаємодіють один з одним у
певному часовому порядку. Вона ілюструє обмін повідомленнями між об'єктами
для виконання конкретного процесу. Розглянемо детальну діаграму
послідовності, що описує процес атаки ворога гравцем.
Опис процесу атаки ворога гравцем:
37
ЧДТУ.24 2211.002ПЗ
Гравець ініціює атаку на ворога, натискаючи відповідну кнопку.
Гра отримує сигнал від гравця та передає його об'єкту "Ворог".
Ворог зменшує своє здоров'я на відповідну величину внаслідок атаки
гравця.
Ворог перевіряє свій стан здоров'я:
Якщо здоров'я ворога <= 0, ворог помирає.
Інакше ворог атакує гравця у відповідь.
Гра оновлює стан ворога та гравця відповідно до результатів перевірок.
Нижче наведено діаграму послідовності (Рис. 2.10).
Рисунок 2.10 – Діаграма послідовності до «програмного забезпечення
комп'ютерної гри Butterfly»
Опис елементів діаграми:
Actor Гравець (Player): Ініціює дію атаки.
Participant Гра (Game): Основний контролер, який обробляє взаємодії між
гравцем та ворогом.
Participant Ворог (Enemy): Об'єкт, на якому здійснюється атака гравця.
Кроки процесу:
Натискання кнопки атаки гравцем:
38
ЧДТУ.24 2211.002ПЗ
Гравець натискає кнопку для здійснення атаки. Це генерує сигнал, який
передається до гри.
Передача сигналу до ворога:
Гра отримує сигнал від гравця та передає команду на виконання атаки ворога. Це
включає зменшення здоров'я ворога на відповідну величину.
Перевірка стану здоров'я ворога:
Ворог перевіряє свій стан здоров'я після атаки. Якщо здоров'я ворога стало
менше або дорівнює нулю, ворог вважається мертвим.
Оновлення стану ворога:
Якщо ворог помирає, гра оновлює свій стан та інформує гравця про смерть
ворога.
Якщо ворог ще живий, він здійснює відповідну атаку на гравця.
Атака ворога на гравця:
Ворог атакує гравця у відповідь. Це зменшує здоров'я гравця.
Оновлення стану гравця:
Гра оновлює стан гравця після атаки ворога, інформуючи його про зміну
здоров'я.
2.5.3 Діаграма комунікації
Діаграма комунікації показує взаємодію між об'єктами у системі з
акцентом на обмін повідомленнями. Вона схожа на діаграму послідовності, але
більше зосереджена на структурних зв'язках між об'єктами. Розглянемо детальну
діаграму комунікації, що описує процес взаємодії гравця з об'єктом у грі
"Butterfly".
Опис процесу взаємодії гравця з об'єктом:
Гравець ініціює взаємодію з об'єктом.
Гра отримує сигнал від гравця та визначає, з яким об'єктом відбувається
взаємодія.
Об'єкт обробляє взаємодію та надсилає відповідь назад до гри.
Гра оновлює стан об'єкта та гравця відповідно до результатів взаємодії.
39
ЧДТУ.24 2211.002ПЗ
На діаграмі комунікації зображено взаємодію між користувачем та
компонентами програми (Рис 2.11).
Опис елементів діаграми:
Actor Гравець (Player): Ініціює дію взаємодії.
Object Гра (Game): Основний контролер, який обробляє взаємодії між
гравцем та об'єктами.
Object Об'єкт (GameObject): Елемент гри, з яким взаємодіє гравець.
Кроки процесу:
Виконання дії гравцем:
Гравець ініціює дію, таку як натискання кнопки для взаємодії з об'єктом.
Це генерує сигнал, який передається до гри.
Передача сигналу до об'єкта:
Гра отримує сигнал від гравця та визначає об'єкт, з яким відбувається
взаємодія. Гра передає команду на взаємодію об'єкту.
Обробка взаємодії об'єктом:
Об'єкт отримує команду на взаємодію та виконує відповідні дії. Це може
включати зміну стану об'єкта, активацію певних функцій тощо.
Відповідь об'єкта:
Об'єкт надсилає відповідь назад до гри, інформуючи про результат
взаємодії. Це може включати інформацію про зміну стану об'єкта або інші
результати дії.
Оновлення стану гри:
Гра отримує відповідь від об'єкта та оновлює свій стан відповідно до
результатів взаємодії. Це може включати оновлення відображення гри, зміну
стану гравця тощо.
Ця діаграма комунікації надає чітке уявлення про те, як об'єкти
взаємодіють один з одним під час процесу взаємодії гравця з об'єктом. Вона
допомагає краще зрозуміти логіку гри та її реалізацію, що є важливим для
ефективного проектування та розробки програмного комплексу.
40
ЧДТУ.24 2211.002ПЗ
Рисунок 2.11 – Діаграма комунікації до «програмного забезпечення комп'ютерної
гри Butterfly»
2.5.4 Діаграма скінченного автомату
Діаграма скінченного автомату показує стани системи та переходи між
ними на основі подій. Вона корисна для моделювання поведінки об'єктів у
системі, які мають чітко визначені стани. Розглянемо детальну діаграму
скінченного автомату, що описує стани ворога в грі "Butterfly".(Рис.2.12)
Опис процесу поведінки ворога:
Спокій (Idle): Початковий стан ворога, коли він не бачить гравця.
Переслідування (Chase): Ворог переходить у цей стан, коли виявляє гравця.
Атака (Attack): Ворог переходить у цей стан, коли знаходиться достатньо
близько до гравця для атаки.
Смерть (Dead): Ворог переходить у цей стан, коли його здоров'я зменшується до
нуля або нижче. Опис станів і переходів:
- Спокій (Idle):
- умова входу: ворог не бачить гравця;
- подія: ворог виявляє гравця;
- перехід: ворог переходить до стану переслідування (Chase).
- Переслідування (Chase):
- умова входу: ворог виявляє гравця;
- подія: гравець входить у зону атаки ворога;
- перехід: ворог переходить до стану атаки (Attack).
- Атака (Attack):
- умова входу: гравець у зоні атаки ворога;
- подія: здоров'я ворога зменшується до нуля або нижче;
41
ЧДТУ.24 2211.002ПЗ
- перехід: ворог переходить до стану смерті (Dead);
- подія: гравець виходить із зони атаки ворога;
- перехід: ворог повертається до стану переслідування (Chase).
- Смерть (Dead):
- умова входу: здоров'я ворога зменшується до нуля або нижче;
- подія: -;
- перехід: кінцевий стан.
- Повернення до стану спокою (Chase -> Idle):
- умова входу: гравець втрачений з поля зору ворога;
- подія -;
- перехід: ворог повертається до стану спокою (Idle).
Ця діаграма скінченного автомату надає чітке уявлення про стани ворога та
переходи між ними в залежності від подій у грі. Вона допомагає краще зрозуміти
логіку поведінки ворогів та їхню взаємодію з гравцем у грі "Butterfly".
42
ЧДТУ.24 2211.002ПЗ
Рисунок 2.12 – Діаграма скінченного автомату до «програмного забезпечення
комп'ютерної гри Butterfly»
43
ЧДТУ.24 2211.002ПЗ
Висновки до розділу 2
У цьому розділі було розглянуто проектування програмного забезпечення
гри "Butterfly". Було створено та проаналізовано кілька діаграм, які детально
відображають архітектуру та поведінку системи. Основні результати цього
розділу включають:
Моделювання предметної області
Визначено основні елементи предметної області, такі як гравець, вороги,
об'єкти, рівні та інтерфейс користувача.
Побудовано діаграму класів, яка відображає взаємозв'язки між основними
класами гри.
Створено словник предметної області для кращого розуміння основних
термінів та їхніх визначень.
Формування та аналіз вимог
Розроблено первинні та детальні вимоги до програмного забезпечення, що
охоплюють функціональні та нефункціональні аспекти гри.
Використано діаграму прецедентів для візуалізації основних сценаріїв
використання системи.
Проектування логічної структури програмного комплексу:
Побудовано діаграму класів, яка демонструє логічну структуру
програмного комплексу та взаємодію між класами.
Створено діаграму пакетів, яка показує, як класи згруповані в логічні блоки
для полегшення підтримки та навігації по коду.
Архітектурне проектування:
Розроблено діаграму компонентів, яка відображає взаємодію між різними
частинами системи.
Створено діаграму розгортання, що показує, як програмний комплекс
розгортається на апаратних засобах.
Моделювання поведінки системи:
Розроблено діаграму діяльності, яка показує потік управління в системі під
44
ЧДТУ.24 2211.002ПЗ
час запуску гри.
Створено діаграму послідовності, яка ілюструє процес атаки ворога
гравцем.
Побудовано діаграму комунікації, що показує взаємодію між об'єктами у
системі.
Розроблено діаграму скінченного автомату, яка моделює стани ворога в грі
та переходи між ними.
Проектування програмного забезпечення гри "Butterfly" здійснювалося з
використанням різних діаграм UML, що дозволило детально описати архітектуру
та поведінку системи. Це забезпечило чітке розуміння логіки гри та її
компонентів, що є важливим для подальшої реалізації та підтримки програмного
комплексу.
45
ЧДТУ.24 2211.002ПЗ
РОЗДІЛ 3 РОЗРОБКА ТА ТЕСТУВАННЯ ПРОГРАМНОГО
ЗАБЕЗПЕЧЕННЯ
3.1 Розробка програмного комплексу
У цьому підрозділі розглянемо процес розробки програмного комплексу
для гри "Butterfly". Основні етапи розробки включають підготовку середовища
розробки, реалізацію функціональних модулів, інтеграцію компонентів та
проведення початкового тестування.
3.1.1 Обґрунтування вибору засобів реалізації
При розробці програмного комплексу для гри "Butterfly" було прийнято
рішення використовувати певні засоби реалізації, що обумовлено їх перевагами
та відповідністю вимогам проєкту. Основними критеріями вибору були
функціональність, зручність використання, продуктивність та підтримка
спільноти. Нижче наведено обґрунтування вибору основних засобів реалізації.
Мова програмування: Python
Python був обраний як основна мова програмування для розробки гри
"Butterfly" з кількох причин:
Легкість у навчанні та використанні: Python має простий та зрозумілий
синтаксис, що прискорює процес розробки.
Велика кількість бібліотек: Python пропонує широкий спектр бібліотек для
розробки ігор, графіки та обробки даних.
Підтримка спільноти: Python має велику спільноту розробників, що
забезпечує підтримку та швидке вирішення проблем.
Бібліотека для графіки та обробки подій: Pygame
Pygame був обраний як основна бібліотека для відображення графіки та
обробки подій у грі "Butterfly" з наступних причин:
Функціональність: Pygame надає всі необхідні інструменти для роботи з
графікою, звуком та подіями.
Простота у використанні: Бібліотека легко інтегрується з Python і має
простий інтерфейс.
46
ЧДТУ.24 2211.002ПЗ
Портативність: Pygame працює на різних платформах, що забезпечує
кросплатформенність гри.
Бібліотека для оптимізації обчислень: Numba
Numba був обраний для оптимізації обчислень у грі "Butterfly", особливо
для алгоритмів трасування променів та рейкастингу, з таких причин:
Підвищення продуктивності: Numba дозволяє компілювати Python-код до
машинного коду, що значно підвищує швидкість виконання обчислень.
Простота інтеграції: Бібліотека легко інтегрується з існуючим Python-
кодом без значних змін.
Підтримка паралелізації: Numba підтримує багатопоточність і
використання GPU, що забезпечує додаткове підвищення продуктивності.
Інтегроване середовище розробки (IDE): Visual Studio Code
Visual Studio Code був обраний як основне середовище розробки з
наступних причин:
Легкість у налаштуванні: Visual Studio Code має безліч розширень, що
полегшують налаштування середовища під потреби розробника.
Зручність у використанні: Інтерфейс IDE інтуїтивно зрозумілий і
забезпечує високу продуктивність праці.
Підтримка розширень: Велика кількість доступних розширень для
підтримки різних мов програмування, систем контролю версій та інструментів
для розробки.
Система контролю версій: Git
Git був обраний як система контролю версій для управління кодовою
базою проєкту:
Надійність: Git забезпечує надійне збереження історії змін і можливість
відновлення попередніх версій коду.
Спільна робота: Git дозволяє кільком розробникам працювати над
проєктом одночасно, забезпечуючи зручні засоби для злиття змін.
Поширеність: Git є однією з найпоширеніших систем контролю версій, що
забезпечує доступність навчальних матеріалів та підтримку спільноти.
47
ЧДТУ.24 2211.002ПЗ
Обрані засоби реалізації забезпечують ефективний процес розробки,
високу продуктивність та зручність використання, що дозволяє створити якісний
та функціональний програмний комплекс для гри "Butterfly".
3.1.2 Опис структурної (функціональної) схеми
Структурна (функціональна) схема гри "Butterfly" відображає основні
компоненти системи та їх взаємодію між собою. Вона допомагає зрозуміти, як
різні частини програмного комплексу працюють разом для забезпечення
основної функціональності гри. Нижче наведено опис основних компонентів та
їх функцій.
Основні компоненти системи:
Main (Головний компонент):
- відповідає за ініціалізацію гри, запуск ігрового циклу та
координування роботи інших компонентів;
- запускає основний цикл гри, де відбувається оновлення стану гри та
рендеринг графіки.
Player (Гравець):
- представляє гравця в грі;
- відповідає за управління рухом, атакою та взаємодією з об'єктами;
- обробляє ввід користувача (клавіатура, миша).
Enemy (Ворог):
- представляє ворогів у грі;
- відповідає за їхню поведінку, переслідування гравця та атаки.
GameObject (Ігровий об'єкт):
- представляє об'єкти, з якими гравець може взаємодіяти (зброя,
медичні аптечки, перешкоди тощо);
- відповідає за відображення та поведінку об'єктів.
Level (Рівень):
- представляє структуру ігрового світу;
- відповідає за завантаження, рендеринг ігрової карти та розташування
48
ЧДТУ.24 2211.002ПЗ
об'єктів і ворогів.
UI (Інтерфейс користувача):
- відповідає за відображення елементів інтерфейсу (меню, індикатори
здоров'я, інвентар);
- обробляє взаємодію користувача з інтерфейсом.
RayCasting (Трасування променів):
- реалізує алгоритми трасування променів та рейкастингу для
відображення тривимірної сцени;
- використовує оптимізації для підвищення продуктивності
рендерингу.
Map (Карта світу):
- зберігає структуру ігрової карти у вигляді матриці;
- відповідає за генерацію карти та визначення об'єктів для
відображення.
Ця структурна схема показує, як основні компоненти гри "Butterfly"
взаємодіють між собою. Кожен компонент відповідає за певну функціональність,
що забезпечує модульність та зручність у розробці й підтримці програмного
комплексу (Рис. 3.1).
49
ЧДТУ.24 2211.002ПЗ
Рисунок 3.1 – Структурна схема програмної системи до «програмного
забезпечення комп'ютерної гри Butterfly»
50
ЧДТУ.24 2211.002ПЗ
Функціональна схема програмної системи
Функціональна схема програмної системи "Butterfly" містить основні
компоненти: інтерфейс користувача, модуль налаштування системи, підсистема
обробки ігрових сцен та файловий менеджер. (Рис. 3.2).
Інтерфейс користувача є основним компонентом, через який користувач
взаємодіє з програмою, запускає її, вводить параметри, налаштовує гру, керує
гравцем та зберігає результати.
Модуль налаштування системи відповідає за отримання та застосування
параметрів налаштувань системи, отримує параметри налаштування від
користувача і передає їх до інтерфейсу користувача.
Підсистема обробки ігрових сцен відповідає за обробку ігрових сцен
відповідно до заданих параметрів, отримує сцени та параметри обробки від
інтерфейсу користувача і повертає оброблені сцени назад до інтерфейсу
користувача.
Файловий менеджер відповідає за управління файлами у файловій системі,
отримує запити від інтерфейсу користувача на збереження та завантаження
станів гри і повертає стан до інтерфейсу користувача або підтвердження про
збереження.
У взаємодії між компонентами реалізується наступна послідовність дій:
Користувач запускає програму через інтерфейс користувача, який отримує
параметри налаштувань від модуля налаштування системи.
Файловий менеджер повертає обраний стан гри до інтерфейсу користувача,
після чого користувач задає параметри обробки сцени через інтерфейс
користувача, який передає їх до підсистеми обробки ігрових сцен.
Підсистема обробки повертає оброблену сцену до інтерфейсу користувача.
Користувач вибирає місце збереження стану гри через інтерфейс
користувача, який передає запит до файлового менеджера.
51
ЧДТУ.24 2211.002ПЗ
Рисунок 3.2 – Функціональна схема програмної системи до «програмного
забезпечення комп'ютерної гри Butterfly»
3.1.3 Опис логічної схеми системи
Логічна схема системи описує структуру програмного комплексу
"Butterfly", яка складається з основних модулів та їх взаємодії. Вона дозволяє
зрозуміти, як компоненти системи співпрацюють для досягнення загальної мети
— забезпечення плавного та захоплюючого ігрового процесу. (Рис 3.3).
Основні компоненти системи
Main (Головний модуль):
Відповідає за ініціалізацію гри, запуск ігрового циклу та координацію
52
ЧДТУ.24 2211.002ПЗ
роботи всіх інших модулів.
Виконує функцію головного контролера, який управляє всіма аспектами
гри.
Player (Гравець):
Реалізує функціонал управління гравцем, включаючи рух, атаки та
взаємодію з об'єктами гри.
Обробляє введення від користувача та передає відповідні команди до
інших модулів.
Enemy (Вороги):
Відповідає за поведінку ворогів у грі, включаючи їх переслідування гравця
та атаки.
Реалізує різні патерни поведінки ворогів залежно від ситуації в грі.
GameObject (Ігрові об'єкти):
Реалізує відображення та взаємодію з різними об'єктами у грі, такими як
зброя, медичні аптечки, перешкоди тощо.
Відповідає за логіку об'єктів, їхні стани та взаємодію з гравцем і ворогами.
Level (Рівень):
Відповідає за завантаження та рендеринг ігрових карт.
Координує розташування об'єктів і ворогів на карті.
UI (Інтерфейс користувача):
Відповідає за відображення інтерфейсу користувача, включаючи меню,
індикатори здоров'я, інвентар та інші елементи.
Забезпечує взаємодію користувача з грою через різні графічні елементи.
RayCasting (Трасування променів):
Реалізує алгоритми трасування променів та рейкастингу для відображення
тривимірної сцени.
Відповідає за оптимізацію рендерингу для забезпечення швидкої та
ефективної роботи гри.
Map (Карта):
Зберігає структуру ігрової карти та відповідає за її генерацію.
53
ЧДТУ.24 2211.002ПЗ
Визначає розташування об'єктів та інших елементів на карті..
Рисунок 3.3 – Опис логічної схеми системи до «програмного забезпечення
комп'ютерної гри Butterfly»
3.1.4 Розробка бази даних
У програмному комплексі "Butterfly" відсутня база даних, і її розробка не
була передбачена на етапі планування. Гра "Butterfly" розрахована на виконання
без необхідності зберігання значних обсягів даних у базі. Всі необхідні дані
обробляються та зберігаються в пам'яті під час виконання гри, а збереження
стану гри реалізується через файли.
3.1.5 Розробка інтерфейсу користувача
- Інтуїтивність:
- Інтерфейс повинен бути легким для розуміння та використання,
навіть для нових користувачів.
- Всі елементи керування повинні бути логічно розташовані та легко
доступні.
54
ЧДТУ.24 2211.002ПЗ
- Зручність:
- Інтерфейс повинен бути зручним для використання під час гри, не
відволікаючи користувача від ігрового процесу.
- Використання гарячих клавіш для швидкого доступу до основних
функцій.
- Інформативність:
- Відображення всіх важливих даних про стан гри, таких як здоров'я
гравця, кількість боєприпасів, рівень і т.д.
- Можливість перегляду налаштувань гри та інвентаря.
Основні компоненти інтерфейсу користувача
- Головне меню:
- Включає опції для початку нової гри, завантаження збереженої гри,
налаштувань та виходу з гри.
- Інтуїтивно зрозуміла навігація між пунктами меню.
- Ігровий інтерфейс:
- Відображає поточний стан гри: здоров'я гравця, кількість
боєприпасів, міні-карта та інші важливі елементи.
- Містить елементи керування для взаємодії з об'єктами, атаки,
використання предметів та інші дії.
- Налаштування:
- Дозволяє користувачу налаштовувати графіку, звук, управління та
інші параметри гри.
- Можливість зберігання та завантаження налаштувань.
- Екран паузи:
- Дозволяє гравцю призупинити гру, отримати доступ до налаштувань
або вийти з гри.
- Відображає основну інформацію про стан гри.
55
ЧДТУ.24 2211.002ПЗ
Рисунок 3.4 – Вигляд інтерфейсу «програмного забезпечення комп'ютерної гри
Butterfly»
Ця структура інтерфейсу забезпечує зручну та інтуїтивну взаємодію
користувача з грою, надаючи всі необхідні інструменти для налаштування та
управління ігровим процесом..
3.1.6 Опис розробки програмних компонентів
3.2 Тестування системи У цьому підрозділі описується процес розробки
основних програмних компонентів системи "Butterfly". Кожен компонент
виконує певні функції та взаємодіє з іншими компонентами для забезпечення
роботи гри. Основні компоненти, які будуть розглянуті, включають Main, Player,
Enemy, GameObject, Level, UI, RayCasting та Map.
Main (Головний модуль)
Опис:
- Головний модуль відповідає за ініціалізацію гри, запуск ігрового циклу та
56
ЧДТУ.24 2211.002ПЗ
координацію роботи інших компонентів.
Ключові методи:
- initialize(): Ініціалізація всіх необхідних ресурсів і налаштувань для запуску
гри.
- startGameLoop(): Запуск основного ігрового циклу, який обробляє події,
оновлює стани та відображає гру.
- coordinateComponents(): Координація взаємодії між різними компонентами
гри.
Player (Гравець)
Опис:
Реалізує функціонал управління гравцем, включаючи рух, атаки та
взаємодію з об'єктами гри.
Ключові методи:
‒ move(): Обробка руху гравця відповідно до вводу користувача.
‒ attack(): Виконання атак гравцем.
‒ interactWithObjects(): Взаємодія з об'єктами в ігровому світі.
‒ processUserInput(): Обробка вводу від користувача (клавіатура, миша).
Enemy (Вороги)
Опис:
- Відповідає за поведінку ворогів у грі, включаючи їх переслідування гравця
та атаки.
Ключові методи:
- behave(): Реалізація поведінкових патернів ворогів.
- chasePlayer(): Переслідування гравця.
- attack(): Виконання атак ворогами.
GameObject (Ігрові об'єкти)
Опис:
- Відповідає за відображення та взаємодію з різними об'єктами у грі.
Ключові методи:
- display(): Відображення об'єктів у грі.
57
ЧДТУ.24 2211.002ПЗ
- interactWithPlayer(): Взаємодія з гравцем.
Level (Рівень)
Опис:
- Відповідає за завантаження та рендеринг ігрових карт, а також
розташування об'єктів і ворогів на карті.
Ключові методи:
- loadMap(): Завантаження ігрової карти.
- renderMap(): Рендеринг ігрової карти.
- placeObjectsAndEnemies(): Розташування об'єктів та ворогів на карті.
UI (Інтерфейс користувача)
Опис:
- Відповідає за відображення інтерфейсу користувача, включаючи меню,
індикатори здоров'я, інвентар та інші елементи.
Ключові методи:
- displayInterface(): Відображення основного інтерфейсу гри.
- showHealthIndicators(): Відображення індикаторів здоров'я.
- showInventory(): Відображення інвентаря.
- interactWithUser(): Забезпечення взаємодії з користувачем.
RayCasting (Трасування променів)
Опис:
- Реалізує алгоритми трасування променів та рейкастингу для відображення
тривимірної сцени.
Ключові методи:
- traceRays(): Реалізація алгоритмів трасування променів.
- performRaycasting(): Виконання рейкастингу для відображення тривимірної
сцени.
- optimizeRendering(): Оптимізація процесу рендерингу.
Map (Карта)
Опис:
- Зберігає структуру ігрової карти та відповідає за її генерацію.
58
ЧДТУ.24 2211.002ПЗ
Ключові методи:
‒ storeMapStructure(): Зберігання структури карти.
‒ generateMap(): Генерація ігрової карти.
‒ defineObjects(): Визначення розташування об'єктів на карті.
В даному підрозділі ми проведемо такі тестування до створеної програми:
модульне тестування, інтеграційне тестування, системне тестування та
приймальне тестування. Розглянемо ці питання більш детальніше.
3.2.1 Модульне тестування
Тестування системи "Butterfly" є важливим етапом у процесі розробки, який
дозволяє перевірити правильність її функціонування, виявити та виправити
помилки, а також забезпечити стабільність та надійність роботи. У цьому розділі
описуються методи тестування, які використовувалися, та результати тестування.
Процес проведення модульного тестування
Розробка тестових сценаріїв
У процесі тестування системи "Butterfly" були розроблені тестові сценарії для
кожного модуля та їх взаємодій. Тестові сценарії включають наступні кроки:
- Модульне тестування:
- Main: тестування ініціалізації гри, запуску ігрового циклу та
координації компонентів.
- Player: тестування руху, атаки, взаємодії з об'єктами та обробки
вводу користувача.
- Enemy: тестування поведінки ворогів, переслідування гравця та
атаки.
- GameObject: тестування відображення та взаємодії з гравцем.
- Level: тестування завантаження карт, рендерингу та розташування
об'єктів і ворогів.
- UI: тестування відображення інтерфейсу, індикаторів здоров'я,
інвентаря та взаємодії з користувачем.
59
ЧДТУ.24 2211.002ПЗ
- RayCasting: тестування алгоритмів трасування променів, рейкастингу
та оптимізації рендерингу.
- Map: тестування зберігання структури карти, генерації карт та
визначення об'єктів.
- Інтеграційне тестування:
- перевірка взаємодії між Main та Player.
- тестування взаємодії між Player та Enemy.
- перевірка передачі даних між GameObject та Level.
- тестування взаємодії між UI та Player.
- перевірка взаємодії між RayCasting та Level.
- тестування взаємодії між Map та Level.
- Системне тестування:
- перевірка функціональності всієї системи в цілому.
- тестування роботи гри в різних умовах та з різними конфігураціями
налаштувань.
- Тестування інтерфейсу користувача:
- перевірка зручності використання та коректності відображення
елементів інтерфейсу.
- тестування навігації в меню, відображення індикаторів здоров'я та
інвентаря.
- Продуктивність та навантажувальне тестування:
- оцінка швидкодії системи при виконанні основних операцій.
- тестування стабільності роботи гри при високих навантаженнях.
Створення тестових даних
Для проведення тестування були створені відповідні тестові дані:
- Дані для модульного тестування:
набори даних для перевірки функцій кожного окремого модуля,
таких як координати гравця, стан здоров'я, кількість ворогів,
розташування об'єктів тощо.
- Дані для інтеграційного тестування:
60
ЧДТУ.24 2211.002ПЗ
набори даних, що моделюють взаємодію між модулями, включаючи
сценарії переміщення гравця, атаки ворогів, взаємодії з об'єктами та
рендерингу карт.
- Дані для системного тестування:
сценарії, що охоплюють всі аспекти роботи системи, включаючи
різні конфігурації налаштувань та сценарії використання.
- Дані для тестування інтерфейсу користувача:
дані для перевірки відображення та взаємодії елементів інтерфейсу,
таких як меню, індикатори здоров'я, інвентар.
- Дані для продуктивності та навантажувального тестування:
дані для перевірки роботи гри при високих навантаженнях,
включаючи велика кількість ворогів та складні сцени.
Виконання тестів
Планування тестування:
- визначення обсягу та методів тестування.
- розробка тестових сценаріїв та кейсів для кожного методу
тестування.
Розробка тестових сценаріїв:
- створення сценаріїв для перевірки функціональності кожного
компонента та взаємодії між ними.
- визначення очікуваних результатів для кожного тесту.
Запуск тестів:
- виконання модульного тестування для кожного компонента.
- проведення інтеграційного тестування для перевірки взаємодії між
модулями.
- виконання системного тестування для перевірки всієї системи в
цілому.
- тестування інтерфейсу користувача для перевірки зручності та
коректності відображення елементів.
- проведення тестування продуктивності та навантажувального
61
ЧДТУ.24 2211.002ПЗ
тестування для оцінки швидкодії системи.
Аналіз результатів тестування:
- оцінка результатів виконання тестів та відповідність фактичних
результатів очікуваним.
- документування виявлених помилок та їх вирішення.
Таблиця 3.1
Результати модульного тестування
1. Модульне тестування: - Всі основні компоненти пройшли
модульне тестування. Виявлені
незначні помилки були
виправлені.
2. Інтеграційне тестування: - Взаємодія між компонентами
перевірена та працює коректно.
- Деякі незначні проблеми з
передачею даних були виявлені та
вирішені.
3. Системне тестування: - Система в цілому працює
відповідно до вимог. Всі основні
функції гри були перевірені та
працюють коректно.
4. Тестування інтерфейсу - Інтерфейс користувача зручний
користувача: для використання та коректно
відображається. Деякі елементи
були доопрацьовані для
покращення юзабіліті.
5. Продуктивність та - Гра демонструє високу
навантажувальне продуктивність при виконанні
тестування: основних операцій. Під час
високих навантажень система
працює стабільно.
Висновки: Процес тестування системи "Butterfly" дозволив виявити та
62
ЧДТУ.24 2211.002ПЗ
виправити ряд помилок, що забезпечило стабільність та надійність роботи гри.
Всі основні функціональні та нефункціональні вимоги були перевірені та
виконані. Система готова до використання та відповідає очікуванням
користувачів.
3.2.2 Інтеграційне тестування
Інтеграційне тестування спрямоване на перевірку коректної взаємодії між
різними модулями системи "Butterfly". Після проведення модульного тестування
кожного окремого компонента, необхідно переконатися, що всі модулі працюють
разом без помилок та забезпечують коректну функціональність гри.
Мета інтеграційного тестування
1 Перевірка взаємодії між модулями:
- забезпечити правильну передачу даних та управління між модулями.
2 Виявлення помилок на стиках між модулями:
- виявити можливі проблеми, які можуть виникати під час взаємодії
між окремими частинами системи.
3 Переконання в цілісності системи:
- забезпечити стабільну та надійну роботу всієї системи в цілому.
Основні кроки інтеграційного тестування
1 Вибір підходу до інтеграційного тестування:
- інкрементальний підхід: поступове інтегрування модулів та
тестування кожного етапу;
- тестування "зверху-вниз": початок з інтеграції головного модуля і
поступове додавання підмодулів;
- тестування "знизу-вгору": початок з тестування базових модулів і
поступове підключення вищих рівнів.
2 Розробка тестових сценаріїв:
- створення тестових сценаріїв, що охоплюють всі можливі взаємодії
між модулями;
- визначення очікуваних результатів для кожного тесту.
63
ЧДТУ.24 2211.002ПЗ
3 Виконання тестів:
- запуск тестів для перевірки взаємодії між модулями;
- виявлення та фіксація помилок, що виникають під час тестування.
Взаємодії, що підлягають тестуванню
1 Main і Player:
- перевірка запуску гри та початку ігрового циклу;
- взаємодія гравця з основним модулем для управління грою.
2 Player і Enemy:
- тестування реакції ворогів на дії гравця, такі як переслідування та
атака;
- перевірка коректної передачі даних між гравцем та ворогами.
3 Player і GameObject:
- взаємодія гравця з ігровими об'єктами, такими як зброя, медичні
аптечки та інші предмети;
- перевірка коректної взаємодії між гравцем та об'єктами гри.
4 GameObject і Level:
- перевірка розташування об'єктів на рівні;
- тестування взаємодії об'єктів з ігровим середовищем.
5 UI і Player:
- відображення стану гравця, такого як здоров'я, кількість боєприпасів
та інвентар;
- перевірка взаємодії між інтерфейсом користувача та гравцем.
6 UI і Level:
- відображення міні-карти та інших елементів, пов'язаних з рівнем;
- перевірка коректної взаємодії між інтерфейсом користувача та
рівнем.
7 RayCasting і Level:
- перевірка трасування променів для рендерингу тривимірних сцен;
- тестування взаємодії між алгоритмами рейкастингу та рівнем.
8 Map і Level:
64
ЧДТУ.24 2211.002ПЗ
- генерація та зберігання структури ігрової карти;
- перевірка розташування об'єктів та ворогів на карті.
Результати інтеграційного тестування
1 Main і Player:
- виявлено та виправлено помилки, пов'язані з ініціалізацією гри та
взаємодією гравця з основним модулем.
2 Player і Enemy:
- тестування показало коректну взаємодію між гравцем та ворогами;
деякі незначні проблеми були вирішені.
3 Player і GameObject:
- перевірка взаємодії гравця з об'єктами гри пройшла успішно. Всі
об'єкти правильно реагують на дії гравця.
4 GameObject і Level:
- виявлено та виправлено помилки, пов'язані з розташуванням об'єктів
на рівні.
5 UI і Player:
- інтерфейс користувача коректно відображає стан гравця. Деякі
елементи були доопрацьовані для покращення зручності
використання.
6 UI і Level:
- відображення міні-карти та інших елементів, пов'язаних з рівнем,
працює правильно.
7 RayCasting і Level:
- трасування променів для рендерингу тривимірних сцен працює
коректно. Оптимізація рендерингу дала позитивні результати.
8 Map і Level:
- генерація та зберігання структури ігрової карти працює без помилок;
всі об'єкти та вороги правильно розташовуються на карті.
3.2.3 Системне тестування
65
ЧДТУ.24 2211.002ПЗ
Системне тестування є завершальним етапом у процесі тестування системи
"Butterfly". Воно спрямоване на перевірку роботи всієї системи в цілому, щоб
переконатися, що всі компоненти правильно взаємодіють між собою та
забезпечують коректне виконання всіх функцій.
Мета системного тестування
1 Перевірка функціональності всієї системи:
- забезпечити правильне виконання всіх функцій гри відповідно до
вимог.
2 Виявлення помилок у взаємодії між компонентами:
- виявити та виправити проблеми, що виникають під час роботи
системи в цілому.
3 Переконання у відповідності системи вимогам:
- забезпечити, що система відповідає всім функціональним та
нефункціональним вимогам, визначеним на етапі планування.
Основні кроки системного тестування
1 Планування системного тестування:
- визначення обсягу та методів тестування;
- розробка тестових сценаріїв та кейсів для системного тестування.
2 Розробка тестових сценаріїв:
- створення сценаріїв, що охоплюють всі аспекти роботи системи;
- визначення очікуваних результатів для кожного тесту.
3 Виконання тестів:
- запуск тестів для перевірки функціональності всієї системи;
- виявлення та фіксація помилок, що виникають під час тестування.
Тестові сценарії для системного тестування
1 Запуск гри:
- перевірка коректного запуску гри;
- перевірка ініціалізації всіх компонентів та початку ігрового циклу.
2 Основний ігровий процес:
- тестування руху гравця, атак та взаємодії з об'єктами;
66
ЧДТУ.24 2211.002ПЗ
- перевірка поведінки ворогів та їх взаємодії з гравцем;
- тестування відображення ігрового інтерфейсу та оновлення стану
гри.
3 Збереження та завантаження гри:
- перевірка функції збереження стану гри;
- тестування завантаження збереженої гри та відновлення стану гри.
4 Взаємодія з користувачем:
- тестування роботи інтерфейсу користувача;
- перевірка відображення меню, налаштувань та індикаторів здоров'я;
- тестування взаємодії користувача з грою через інтерфейс.
5 Рендеринг та графіка:
- перевірка коректного відображення тривимірних сцен;
- тестування роботи алгоритмів трасування променів та рейкастингу;
- перевірка оптимізації рендерингу для забезпечення високої
продуктивності.
6 Перевірка продуктивності:
- тестування швидкодії системи при виконанні основних операцій;
- перевірка стабільності роботи гри при високих навантаженнях.
7 Перевірка налаштувань:
- тестування налаштувань гри, таких як графіка, звук, управління;
- перевірка збереження та завантаження налаштувань.
Виконання тестів
1 Планування тестування:
- визначення обсягу та методів тестування;
- розробка тестових сценаріїв та кейсів для кожного методу
тестування.
2 Розробка тестових сценаріїв:
- створення сценаріїв для перевірки функціональності кожного
компонента та взаємодії між ними;
- визначення очікуваних результатів для кожного тесту.
67
ЧДТУ.24 2211.002ПЗ
3 Запуск тестів:
- виконання модульного тестування для кожного компонента;
- проведення інтеграційного тестування для перевірки взаємодії між
модулями;
- виконання системного тестування для перевірки всієї системи в
цілому;
- тестування інтерфейсу користувача для перевірки зручності та
коректності відображення елементів;
- проведення тестування продуктивності та навантажувального
тестування для оцінки швидкодії системи.
4 Аналіз результатів тестування:
- оцінка результатів виконання тестів та відповідність фактичних
результатів очікуваним;
- документування виявлених помилок та їх вирішення.
Результати системного тестування
1 Запуск гри:
- гра коректно запускається та ініціалізує всі компоненти;
- ігровий цикл починається без помилок.
2 Основний ігровий процес:
- гравець може рухатися, атакувати та взаємодіяти з об'єктами;
- вороги правильно реагують на дії гравця;
- ігровий інтерфейс відображає стан гри коректно.
3 Збереження та завантаження гри:
- функція збереження працює правильно;
- завантаження збереженої гри відбувається без втрати даних.
4 Взаємодія з користувачем:
- інтерфейс користувача зручний для використання та коректно
відображає всі необхідні елементи;
- всі налаштування працюють правильно.
5 Рендеринг та графіка:
68
ЧДТУ.24 2211.002ПЗ
- тривимірні сцени відображаються коректно;
- алгоритми трасування променів та рейкастингу працюють без
помилок;
- оптимізація рендерингу забезпечує високу продуктивність.
6 Перевірка продуктивності:
- гра демонструє високу продуктивність при виконанні основних
операцій;
- під час високих навантажень система працює стабільно.
7 Перевірка налаштувань:
- налаштування гри зберігаються та завантажуються правильно;
- всі зміни налаштувань відображаються коректно.
3.2.4 Приймальне тестування
Приймальне тестування (User Acceptance Testing, UAT) є останнім етапом
тестування програмного забезпечення, перед його впровадженням і
використанням кінцевими користувачами. Цей тип тестування спрямований на
підтвердження того, що система відповідає встановленим вимогам і очікуванням
користувачів.
Мета приймального тестування
1 Перевірка відповідності вимогам:
- переконатися, що система відповідає всім функціональним та
нефункціональним вимогам, визначеним на початку проекту.
2 Оцінка користувацького досвіду:
- забезпечити, що система є зручною та інтуїтивно зрозумілою для
користувачів.
3 Виявлення можливих проблем:
- виявити потенційні проблеми, які можуть виникнути у реальних
умовах використання системи.
Процес приймального тестування
1 Планування приймального тестування:
69
ЧДТУ.24 2211.002ПЗ
- визначення обсягу та методів тестування;
- розробка тестових сценаріїв на основі вимог та очікувань
користувачів.
2 Розробка тестових сценаріїв:
- створення сценаріїв, що моделюють реальні умови використання
системи;
- визначення критеріїв прийняття для кожного тесту.
3 Виконання тестів:
- залучення кінцевих користувачів до тестування системи;
- збір зворотного зв'язку від користувачів щодо функціональності та
зручності використання системи.
4 Аналіз результатів тестування:
- оцінка результатів виконання тестів та відповідність фактичних
результатів очікуваним;
- документування виявлених проблем та їх вирішення.
Тестові сценарії для приймального тестування
1. Запуск гри та ініціалізація:
- перевірка коректного запуску гри та ініціалізації всіх компонентів;
- оцінка зручності навігації у головному меню.
2. Основний ігровий процес:
- тестування руху гравця, атак та взаємодії з об'єктами;
- оцінка поведінки ворогів та їх взаємодії з гравцем;
- відображення ігрового інтерфейсу та оновлення стану гри.
3. Збереження та завантаження гри:
- перевірка функції збереження стану гри;
- тестування завантаження збереженої гри та відновлення стану гри.
4. Налаштування гри:
- тестування налаштувань графіки, звуку, управління;
- оцінка зручності та гнучкості налаштувань.
5. Рендеринг та графіка:
70
ЧДТУ.24 2211.002ПЗ
- перевірка коректного відображення тривимірних сцен;
- оцінка якості графіки та швидкодії рендерингу.
6. Інтерактивність та зворотний зв'язок:
- оцінка взаємодії користувача з грою через інтерфейс;
- збір зворотного зв'язку від користувачів щодо зручності
використання та функціональності системи.
Виконання приймального тестування
1 Планування тестування:
- визначення обсягу та методів тестування;
- розробка тестових сценаріїв та кейсів для кожного методу
тестування.
2 Розробка тестових сценаріїв:
- створення сценаріїв для перевірки функціональності кожного
компонента та взаємодії між ними;
- визначення очікуваних результатів для кожного тесту.
3 Запуск тестів:
- виконання тестів за участю кінцевих користувачів;
- збір зворотного зв'язку та оцінка результатів.
4 Аналіз результатів тестування:
- оцінка відповідності фактичних результатів очікуваним;
- документування виявлених проблем та їх вирішення.
Результати приймального тестування
1 Запуск гри та ініціалізація:
гра коректно запускається та ініціалізує всі компоненти. Користувачі
відзначили зручність навігації у головному меню.
2 Основний ігровий процес:
гравці змогли без проблем управляти персонажем, взаємодіяти з
об'єктами та ворогами. Ігровий інтерфейс відображає всі необхідні
дані.
3 Збереження та завантаження гри:
71
ЧДТУ.24 2211.002ПЗ
функція збереження та завантаження гри працює коректно.
Користувачі змогли зберігати прогрес та відновлювати гру без втрат
даних.
4 Налаштування гри:
налаштування графіки, звуку та управління працюють правильно;
користувачі відзначили гнучкість та зручність налаштувань.
5 Рендеринг та графіка:
графіка та рендеринг тривимірних сцен відповідають очікуванням
користувачів; якість графіки та швидкодія рендерингу були високо
оцінені.
6 Інтерактивність та зворотний зв'язок:
користувачі відзначили високу зручність використання інтерфейсу.
взаємодія з грою через інтерфейс була інтуїтивно зрозумілою.
Приймальне тестування системи "Butterfly" підтвердило, що система
відповідає всім встановленим вимогам та очікуванням користувачів. Виявлені
під час тестування проблеми були вирішені, що забезпечило стабільність та
надійність роботи гри. Система готова до впровадження та використання
кінцевими користувачами.
3.3 Приклади впровадженого програмного комплексу
Інтерфейс користувача "Butterfly" розроблений з урахуванням зручності та
інтуїтивної зрозумілості для гравців. Основні компоненти інтерфейсу включають
головне меню, ігровий інтерфейс, налаштування та екран
збереження/завантаження гри
Первинний вид програми після запуску
Після запуску програми користувач бачить головний інтерфейс програми,
що складається з конопок початку, назви гри та виходу з неї(Рис. 3.5).
Головне меню
Головне меню є першою точкою взаємодії користувача з грою. Воно містить такі
елементи:
72
ЧДТУ.24 2211.002ПЗ
‒ назва гри: розташована вгорі екрана, щоб привітати гравця та створити
перше враження про гру.
‒ кнопка "почати": користувач натискає цю кнопку для запуску нової гри або
продовження вже розпочатої.
Рисунок 3.5 – Інтерфейс «програмного забезпечення комп'ютерної гри Butterfly»
Після того, як гравець натисне кнопку Start, він почне гру та з’явиться на
спавні, тобто на початку рівня (Рис. 3.6).
73
ЧДТУ.24 2211.002ПЗ
Рисунок 3.6 – Початок гри «програмного забезпечення комп'ютерної гри
Butterfly»
Проходження гри
Для того, щоб пройти гру, гравцеві потрібно вбити всих монстрів ―NPC‖
(Рис. 3.7).
74
ЧДТУ.24 2211.002ПЗ
Рисунок 3.7 – Процес знищення NPC «програмного забезпечення комп'ютерної
гри Butterfly»
Перемога в грі
Після того, як гравець знищить всіх NPC, на екрані буде написано YOU
WIN!!! (Рис. 3.8).
75
ЧДТУ.24 2211.002ПЗ
Рисунок 3.8 – Перемога в грі «програмного забезпечення комп'ютерної гри
Butterfly»
Результати тестування
Під час виконання завдань проекту було проведено декілька етапів
тестування програмної системи "Butterfly", кожен з яких мав на меті перевірку
різних аспектів роботи програми та забезпечення її відповідності вимогам.
Першим етапом стало модульне тестування, яке дозволило розробнику
перевірити всі внутрішні структури і потоки даних у кожному модулі. Модульне
тестування забезпечило високу якість кожного модуля, що є важливим для
подальших етапів інтеграційного та системного тестування.
На етапі інтеграційного тестування, яке проводилося незалежним
тестувальником, перевірялася спільна робота окремих модулів. Було перевірено
зв'язки між модулями, їх сумісність і функціональність. Усі модулі гри
"Butterfly" продемонстрували коректну взаємодію та сумісність, що свідчить про
якісну інтеграцію компонентів. Інтеграційне тестування підтвердило, що
76
ЧДТУ.24 2211.002ПЗ
програма може успішно функціонувати як єдиний комплекс.
Системне тестування призначалося для перевірки всієї програмної системи
в цілому. Було перевірено всі основні функції гри, інтеграцію з файловою
системою, продуктивність та безпеку. Системне тестування підтвердило, що
програма відповідає всім заявленим вимогам, стабільно працює під різним
навантаженням, забезпечує належний рівень безпеки та коректно взаємодіє з
іншими системами. Позитивні результати системного тестування свідчать про
готовність гри до використання кінцевими користувачами.
На етапі приймального тестування, яке проводила організація, що
відповідає за інсталяцію та супровід програмної системи, було проведено
додаткову перевірку функціональності, зручності використання та відповідності
вимогам користувачів. Було підтверджено, що програма відповідає очікуванням
користувачів, легко освоюється і забезпечує необхідні функції для ігрового
процесу. Приймальне тестування також включало рекомендації щодо
впровадження та можливого вдосконалення системи у майбутньому.
Загалом, всі етапи тестування показали високий рівень якості розробленої
програмної системи "Butterfly". Програма продемонструвала стабільну роботу,
високу продуктивність, належний рівень безпеки та зручний інтерфейс
користувача. Результати тестування свідчать про успішне виконання проекту та
готовність програми до впровадження і використання. Програма відповідає всім
специфікаціям вимог замовника і готова до застосування у практичних умовах,
що забезпечує її ефективне використання та задоволення потреб користувачів.
77
ЧДТУ.24 2211.002ПЗ
Висновоки до розділу 3
У розділі 3 було детально розглянуто процес розробки та тестування
програмного комплексу "Butterfly". Було проведено ряд важливих етапів,
включаючи вибір засобів реалізації, проектування логічної та функціональної
схем, розробку інтерфейсу користувача та основних програмних компонентів, а
також проведення різноманітних тестувань для забезпечення якості програми.
Процес розробки почався з обґрунтування вибору засобів реалізації, що
включало використання Python та бібліотеки Pygame для створення графічних
елементів, а також Numba для оптимізації обчислень. Було розроблено логічну та
функціональну схему системи, які відобразили основні компоненти гри та їх
взаємодію.
Особливу увагу було приділено розробці інтерфейсу користувача, який
забезпечує зручну та інтуїтивно зрозумілу взаємодію гравця з програмою. Також
було описано процес розробки програмних компонентів, що включало створення
модулів для управління гравцем, ворогами, об'єктами гри, рівнями та іншими
аспектами ігрового процесу.
Тестування системи "Butterfly" проводилося на декількох рівнях. Модульне
тестування перевірило кожен окремий компонент на коректність роботи.
Інтеграційне тестування підтвердило правильну взаємодію між модулями.
Системне тестування перевірило роботу всієї системи в цілому, забезпечивши її
стабільність та відповідність вимогам. Приймальне тестування підтвердило, що
програма відповідає очікуванням користувачів та готова до використання.
Всі етапи розробки та тестування показали високий рівень якості
програмного комплексу "Butterfly". Програма продемонструвала стабільну
роботу, високу продуктивність, належний рівень безпеки та зручний інтерфейс
користувача. Результати тестування свідчать про успішне виконання проекту та
готовність програми до впровадження і використання, що забезпечує її
ефективне використання та задоволення потреб користувачів.
78
ЧДТУ.24 2211.002ПЗ
ВИСНОВКИ
При виконанні дипломної бакалаврської роботи, було розроблено та
впроваджено програмний комплекс "Butterfly", який являє собою тривимірну
гру, створену з використанням алгоритмів трасування променів та рейкастингу.
Проект охопив всі етапи розробки програмного забезпечення: від аналізу
існуючих методів та аналогів до детального проектування, реалізації та
всебічного тестування.
Процес розробки включав вибір засобів реалізації, розробку інтерфейсу
користувача та основних програмних компонентів. Було обрано Python та
бібліотеку Pygame для створення графічних елементів, а також Numba для
оптимізації обчислень. Інтерфейс користувача був розроблений з урахуванням
зручності та інтуїтивної зрозумілості для користувачів.
Тестування системи включало модульне, інтеграційне, системне та
приймальне тестування. Модульне тестування дозволило перевірити кожен
окремий компонент на коректність роботи. Інтеграційне тестування підтвердило
правильну взаємодію між модулями. Системне тестування перевірило роботу
всієї системи в цілому, забезпечивши її стабільність та відповідність вимогам.
Приймальне тестування підтвердило, що програма відповідає очікуванням
користувачів та готова до використання.
Програма відповідає всім специфікаціям вимог замовника і готова до
застосування у практичних умовах, що забезпечує її ефективне використання та
задоволення потреб користувачів.
79
ЧДТУ.24 2211.002ПЗ
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1 Python Documentation. The Python Standard Library. Available at:
https://docs.python.org/3/library/
2 Carmack, J. (1993). DOOM: id Software's revolutionary FPS. Gamasutra.
Available at: https://www.gamasutra.com/
3 Pygame Documentation. Pygame - Python Game Development. Available at:
https://www.pygame.org/docs/
4 Numba Documentation. Numba - High Performance Functions with Python.
Available at: https://numba.pydata.org/numba-doc/latest/
5 Процес модульного тестування - [Електронний ресурс]. -
https://qalight.ua/baza-znaniy/modulne-testuvannya/
6 Abrams, M. (2014). The Evolution of Ray Tracing in Games. IEEE Computer
Graphics and Applications.
7 Adobe Photoshop. Official Website. Available at:
https://www.adobe.com/products/photoshop.html
8 Stack Overflow. Questions tagged [pygame]. Available at:
https://stackoverflow.com/questions/tagged/pygame
9 Особливості Visual Studio Code - [Електронний ресурс]. - Режим доступу:
https://uk.wikipedia.org/wiki/Visual_Studio_Code
10 FL Studio. Official Website. Available at: https://www.image-line.com/
11 GIMP. (GNU Image Manipulation Program). Official Website. Available at:
https://www.gimp.org/
12 BANDICAM https://www.bandicam.com/ru/ing/
13 Lightshot - [Електронний ресурс]. - Режим доступу:
https://app.prntscr.com/ru/
14 Платформа графічного дизайну Canva - [Електронний ресурс]. - Режим
доступу: https://uk.wikipedia.org/wiki/Canva#:~:text=Canva %20(укр.,%2C%
20шрифтів%2C%20шаблонів%20та%20ілюстрацій.
15 Python. Исчерпывающее руководство - [Електронний ресурс]. - Режим
80
ЧДТУ.24 2211.002ПЗ
доступу: https://sd.blackball.lv/books/19011-python-ischerpyvajuwee-
rukovodstvo-2023
16 Adobe Audition: - [Електронний ресурс]. - Режим доступу:
https://www.adobe.com/ua/products/audition.html?gclid=CjwKCAjw-
O6zBhASEiwAOHeGxdTZEmrWBldoZnFEl8vCiPE5jC7ldlnYXOpvCaBd6mg
SvqXJokfh7hoCzT4QAvD_BwE&skwcid=AL!3085!3!341190193410!e!!g!!ado
be%20audition&mv=search&mv2=paidsearch&sdid=MC95SLNN&ef_id=Cjw
KCAjw-
O6zBhASEiwAOHeGxdTZEmrWBldoZnFEl8vCiPE5jC7ldlnYXOpvCaBd6mg
SvqXJokfh7hoCzT4QAvD_BwE:G:s&s_kwcid=AL!3085!3!341190193410!e!!g
!!adobe%20audition!1712281181!68119169038&gad_source=1
17 HTML (мова розмітки гіпертексту) - [Електронний ресурс]. - Режим
доступу: https://uk.wikipedia.org/wiki/HTML
18 Darktable: - [Електронний ресурс]. - Режим доступу:
https://www.darktable.org/
19 Методичні рекомендації до підготовки кваліфікаційної роботи бакалавра
для здобувачів вищої освіти зі спеціальності 121 «Інженерія програмного
забезпечення» усіх форм навчання [Текст] /Укл.: Голуб С.В., Заспа Г.О.,
Півень О.Б. Катаєва Є.Ю., Салапатов В.І., Метелап В.В., Олексюк В.В.; М-
во освіти і науки України.
81
ДОДАТОК А
ЗАТВЕРДЖЕНО:
Зав. кафедри ПЗАС
проф. Голуб С. В.
___________________________
ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ КОМП'ЮТЕРНОЇ ГРИ BUTTERFLY
Специфікація
482.ЧДТУ.242211-002
Листів 2
Розробник ________________ Гладкий В.М.
Керівник ________________ Метелап В.В.
Черкаси 2024
ЧДТУ.24 2211-002 2
Позначення Найменування Примітка
482.ЧДТУ.242211 12 01 Лістинг програми
482.ЧДТУ.242211 34 01 Інструкція користувача
482.ЧДТУ.242211 90 01 Графічні матеріали
80
ДОДАТОК Б
ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ КОМП'ЮТЕРНОЇ ГРИ BUTTERFLY
Лістинг програми
482.ЧДТУ.242211 12-02
Листів 104
Розробник ________________ В.М. Гладкий
Черкаси 2024
ЧДТУ.24 2211-002 2
Файл: drawing.py
import pygame
from settings import *
from ray_casting import ray_casting
from map import mini_map
from collections import deque
from random import randrange
import sys
class Drawing:
def __init__(self, sc, sc_map, player, clock):
self.sc = sc
self.sc_map = sc_map
self.player = player
self.clock = clock
self.font = pygame.font.SysFont('Arial', 36, bold=True)
self.font_win = pygame.font.Font('font/font.ttf', 144)
self.textures = {1: pygame.image.load('img/wall3.png').convert(),
2: pygame.image.load('img/wall4.png').convert(),
3: pygame.image.load('img/wall5.png').convert(),
4: pygame.image.load('img/wall6.png').convert(),
'S': pygame.image.load('img/sky2.png').convert()
}
# menu
self.menu_trigger = True
self.menu_picture = pygame.image.load('img/bg.jpg').convert()
# weapon parameters
self.weapon_base_sprite =
pygame.image.load('sprites/weapons/shotgun/base/0.png').convert_alpha()
self.weapon_shot_animation =
deque([pygame.image.load(f'sprites/weapons/shotgun/shot/{i}.png').convert_alpha()
for i in range(20)])
self.weapon_rect = self.weapon_base_sprite.get_rect()
self.weapon_pos = (HALF_WIDTH - self.weapon_rect.width // 2, HEIGHT -
self.weapon_rect.height)
self.shot_length = len(self.weapon_shot_animation)
self.shot_length_count = 0
self.shot_animation_speed = 3
self.shot_animation_count = 0
self.shot_animation_trigger = True
self.shot_sound = pygame.mixer.Sound('sound/shotgun.wav')
# sfx parameters
self.sfx = deque([pygame.image.load(f'sprites/weapons/sfx/{i}.png').convert_alpha() for i in
range(9)])
self.sfx_length_count = 0
self.sfx_length = len(self.sfx)
def background(self, angle):
sky_offset = -10 * math.degrees(angle) % WIDTH
self.sc.blit(self.textures['S'], (sky_offset, 0))
self.sc.blit(self.textures['S'], (sky_offset - WIDTH, 0))
self.sc.blit(self.textures['S'], (sky_offset + WIDTH, 0))
80
ЧДТУ.24 2211-002 2
pygame.draw.rect(self.sc, DARKGRAY, (0, HALF_HEIGHT, WIDTH, HALF_HEIGHT))
def world(self, world_objects):
for obj in sorted(world_objects, key=lambda n: n[0], reverse=True):
if obj[0]:
_, object, object_pos = obj
self.sc.blit(object, object_pos)
def fps(self, clock):
display_fps = str(int(clock.get_fps()))
render = self.font.render(display_fps, 0, DARKORANGE)
self.sc.blit(render, FPS_POS)
def mini_map(self, player):
self.sc_map.fill(BLACK)
map_x, map_y = player.x // MAP_SCALE, player.y // MAP_SCALE
pygame.draw.line(self.sc_map, YELLOW, (map_x, map_y), (map_x + 12 *
math.cos(player.angle),
map_y + 12 * math.sin(player.angle)), 2)
pygame.draw.circle(self.sc_map, RED, (int(map_x), int(map_y)), 5)
for x, y in mini_map:
pygame.draw.rect(self.sc_map, DARKBROWN, (x, y, MAP_TILE, MAP_TILE))
self.sc.blit(self.sc_map, MAP_POS)
def player_weapon(self, shots):
if self.player.shot:
if not self.shot_length_count:
self.shot_sound.play()
self.shot_projection = min(shots)[1] // 2
self.bullet_sfx()
shot_sprite = self.weapon_shot_animation[0]
self.sc.blit(shot_sprite, self.weapon_pos)
self.shot_animation_count += 1
if self.shot_animation_count == self.shot_animation_speed:
self.weapon_shot_animation.rotate(-1)
self.shot_animation_count = 0
self.shot_length_count += 1
self.shot_animation_trigger = False
if self.shot_length_count == self.shot_length:
self.player.shot = False
self.shot_length_count = 0
self.sfx_length_count = 0
self.shot_animation_trigger = True
else:
self.sc.blit(self.weapon_base_sprite, self.weapon_pos)
def bullet_sfx(self):
if self.sfx_length_count < self.sfx_length:
sfx = pygame.transform.scale(self.sfx[0], (self.shot_projection, self.shot_projection))
sfx_rect = sfx.get_rect()
self.sc.blit(sfx, (HALF_WIDTH - sfx_rect.w // 2, HALF_HEIGHT - sfx_rect.h // 2))
self.sfx_length_count += 1
80
ЧДТУ.24 2211-002 2
self.sfx.rotate(-1)
def win(self):
render = self.font_win.render('YOU WIN!!!', 1, (randrange(40, 120), 0, 0))
rect = pygame.Rect(0, 0, 1000, 300)
rect.center = HALF_WIDTH, HALF_HEIGHT
pygame.draw.rect(self.sc, BLACK, rect, border_radius=50)
self.sc.blit(render, (rect.centerx - 430, rect.centery - 140))
pygame.display.flip()
self.clock.tick(15)
def menu(self):
x = 0
button_font = pygame.font.Font('font/font.ttf', 72)
label_font = pygame.font.Font('font/font1.otf', 200)
start = button_font.render('START', 1, pygame.Color('lightgray'))
button_start = pygame.Rect(0, 0, 400, 150)
button_start.center = HALF_WIDTH, HALF_HEIGHT
exit = button_font.render('EXIT', 1, pygame.Color('lightgray'))
button_exit = pygame.Rect(0, 0, 400, 150)
button_exit.center = HALF_WIDTH, HALF_HEIGHT + 200
while self.menu_trigger:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
self.sc.blit(self.menu_picture, (0, 0), (x % WIDTH, HALF_HEIGHT, WIDTH, HEIGHT))
x += 1
pygame.draw.rect(self.sc, BLACK, button_start, border_radius=25, width=10)
self.sc.blit(start, (button_start.centerx - 130, button_start.centery - 70))
pygame.draw.rect(self.sc, BLACK, button_exit, border_radius=25, width=10)
self.sc.blit(exit, (button_exit.centerx - 85, button_exit.centery - 70))
color = randrange(40)
label = label_font.render('Butterfly', 1, (color, color, color))
self.sc.blit(label, (15, -30))
mouse_pos = pygame.mouse.get_pos()
mouse_click = pygame.mouse.get_pressed()
if button_start.collidepoint(mouse_pos):
pygame.draw.rect(self.sc, BLACK, button_start, border_radius=25)
self.sc.blit(start, (button_start.centerx - 130, button_start.centery - 70))
if mouse_click[0]:
self.menu_trigger = False
elif button_exit.collidepoint(mouse_pos):
pygame.draw.rect(self.sc, BLACK, button_exit, border_radius=25)
self.sc.blit(exit, (button_exit.centerx - 85, button_exit.centery - 70))
if mouse_click[0]:
80
ЧДТУ.24 2211-002 2
pygame.quit()
sys.exit()
pygame.display.flip()
self.clock.tick(20)
Файл: interaction.py
from settings import *
from map import world_map
from ray_casting import mapping
import math
import pygame
from numba import njit
@njit(fastmath=True, cache=True)
def ray_casting_npc_player(npc_x, npc_y, blocked_doors, world_map, player_pos):
ox, oy = player_pos
xm, ym = mapping(ox, oy)
delta_x, delta_y = ox - npc_x, oy - npc_y
cur_angle = math.atan2(delta_y, delta_x)
cur_angle += math.pi
sin_a = math.sin(cur_angle)
sin_a = sin_a if sin_a else 0.000001
cos_a = math.cos(cur_angle)
cos_a = cos_a if cos_a else 0.000001
# verticals
x, dx = (xm + TILE, 1) if cos_a >= 0 else (xm, -1)
for i in range(0, int(abs(delta_x)) // TILE):
depth_v = (x - ox) / cos_a
yv = oy + depth_v * sin_a
tile_v = mapping(x + dx, yv)
if tile_v in world_map or tile_v in blocked_doors:
return False
x += dx * TILE
# horizontals
y, dy = (ym + TILE, 1) if sin_a >= 0 else (ym, -1)
for i in range(0, int(abs(delta_y)) // TILE):
depth_h = (y - oy) / sin_a
xh = ox + depth_h * cos_a
tile_h = mapping(xh, y + dy)
if tile_h in world_map or tile_h in blocked_doors:
return False
y += dy * TILE
return True
class Interaction:
def __init__(self, player, sprites, drawing):
self.player = player
self.sprites = sprites
80
ЧДТУ.24 2211-002 2
self.drawing = drawing
self.pain_sound = pygame.mixer.Sound('sound/pain.wav')
def interaction_objects(self):
if self.player.shot and self.drawing.shot_animation_trigger:
for obj in sorted(self.sprites.list_of_objects, key=lambda obj: obj.distance_to_sprite):
if obj.is_on_fire[1]:
if obj.is_dead != 'immortal' and not obj.is_dead:
if ray_casting_npc_player(obj.x, obj.y,
self.sprites.blocked_doors,
world_map, self.player.pos):
if obj.flag == 'npc':
self.pain_sound.play()
obj.is_dead = True
obj.blocked = None
self.drawing.shot_animation_trigger = False
if obj.flag in {'door_h', 'door_v'} and obj.distance_to_sprite < TILE:
obj.door_open_trigger = True
obj.blocked = None
break
def npc_action(self):
for obj in self.sprites.list_of_objects:
if obj.flag == 'npc' and not obj.is_dead:
if ray_casting_npc_player(obj.x, obj.y,
self.sprites.blocked_doors,
world_map, self.player.pos):
obj.npc_action_trigger = True
self.npc_move(obj)
else:
obj.npc_action_trigger = False
def npc_move(self, obj):
if abs(obj.distance_to_sprite) > TILE:
dx = obj.x - self.player.pos[0]
dy = obj.y - self.player.pos[1]
obj.x = obj.x + 1 if dx < 0 else obj.x - 1
obj.y = obj.y + 1 if dy < 0 else obj.y - 1
def clear_world(self):
deleted_objects = self.sprites.list_of_objects[:]
[self.sprites.list_of_objects.remove(obj) for obj in deleted_objects if obj.delete]
def play_music(self):
pygame.mixer.pre_init(44100, -16, 2, 2048)
pygame.mixer.init()
pygame.mixer.music.load('sound/theme.mp3')
pygame.mixer.music.play(10)
def check_win(self):
if not len([obj for obj in self.sprites.list_of_objects if obj.flag == 'npc' and not obj.is_dead]):
pygame.mixer.music.stop()
80
ЧДТУ.24 2211-002 2
pygame.mixer.music.load('sound/win.mp3')
pygame.mixer.music.play()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
self.drawing.win()
Файл: main.py
from player import Player
from sprite_objects import *
from ray_casting import ray_casting_walls
from drawing import Drawing
from interaction import Interaction
pygame.init()
sc = pygame.display.set_mode((WIDTH, HEIGHT))
sc_map = pygame.Surface(MINIMAP_RES)
sprites = Sprites()
clock = pygame.time.Clock()
player = Player(sprites)
drawing = Drawing(sc, sc_map, player, clock)
interaction = Interaction(player, sprites, drawing)
drawing.menu()
pygame.mouse.set_visible(False)
interaction.play_music()
while True:
player.movement()
drawing.background(player.angle)
walls, wall_shot = ray_casting_walls(player, drawing.textures)
drawing.world(walls + [obj.object_locate(player) for obj in sprites.list_of_objects])
drawing.fps(clock)
drawing.mini_map(player)
drawing.player_weapon([wall_shot, sprites.sprite_shot])
interaction.interaction_objects()
interaction.npc_action()
interaction.clear_world()
interaction.check_win()
pygame.display.flip()
clock.tick()
Файл map.py
from settings import *
import pygame
from numba.core import types
from numba.typed import Dict
from numba import int32
80
ЧДТУ.24 2211-002 2
_ = False
matrix_map = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, _, _, _, _, _, 2, _, _, _, _, _, _, _, _, _, _, 4, _, _, _, _, _, 1],
[1, _, 2, 2, _, _, _, _, _, 2, 2, 2, _, _, _, 3, _, _, _, _, 4, _, _, 1],
[1, _, _, _, _, _, _, _, _, _, _, 2, 2, _, _, _, 3, _, _, _, _, _, _, 1],
[1, _, 2, 2, _, _, _, _, _, _, _, _, 2, _, 4, _, _, 3, _, _, _, 4, _, 1],
[1, _, _, _, _, _, 4, _, _, 2, 2, _, 2, _, _, _, _, _, _, 4, _, _, _, 1],
[1, _, 3, _, _, _, 2, _, _, 2, _, _, 2, _, _, _, 4, _, _, _, _, 4, _, 1],
[1, _, _, 3, _, _, 2, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, 1],
[1, _, 3, _, _, _, _, _, _, _, 3, _, _, 3, 3, _, _, _, _, 3, 3, _, _, 1],
[1, _, 3, _, _, _, 3, 3, _, 3, _, _, _, 3, 3, _, _, _, _, 2, 3, _, _, 1],
[1, _, _, _, _, 3, _, 3, _, _, 3, _, _, _, _, _, _, _, _, _, _, _, _, 1],
[1, _, 4, _, 3, _, _, _, _, 3, _, _, 2, _, _, _, _, _, _, _, _, 2, _, 1],
[1, _, _, _, _, _, 4, _, _, _, _, _, 2, 2, _, _, _, _, _, _, 2, 2, _, 1],
[1, _, _, 4, _, _, _, _, 4, _, _, _, _, 2, 2, 2, 2, 2, 2, 2, 2, _, _, 1],
[1, _, _, _, _, _, _, _, _, _, 4, _, _, _, _, _, _, _, _, _, _, _, _, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
WORLD_WIDTH = len(matrix_map[0]) * TILE
WORLD_HEIGHT = len(matrix_map) * TILE
world_map = Dict.empty(key_type=types.UniTuple(int32, 2), value_type=int32)
mini_map = set()
collision_walls = []
for j, row in enumerate(matrix_map):
for i, char in enumerate(row):
if char:
mini_map.add((i * MAP_TILE, j * MAP_TILE))
collision_walls.append(pygame.Rect(i * TILE, j * TILE, TILE, TILE))
if char == 1:
world_map[(i * TILE, j * TILE)] = 1
elif char == 2:
world_map[(i * TILE, j * TILE)] = 2
elif char == 3:
world_map[(i * TILE, j * TILE)] = 3
elif char == 4:
world_map[(i * TILE, j * TILE)] = 4
Файл player.py
from settings import *
import pygame
import math
from map import collision_walls
class Player:
def __init__(self, sprites):
self.x, self.y = player_pos
self.sprites = sprites
self.angle = player_angle
80
ЧДТУ.24 2211-002 2
self.sensitivity = 0.004
# collision parameters
self.side = 50
self.rect = pygame.Rect(*player_pos, self.side, self.side)
# weapon
self.shot = False
@property
def pos(self):
return (self.x, self.y)
@property
def collision_list(self):
return collision_walls + [pygame.Rect(*obj.pos, obj.side, obj.side) for obj in
self.sprites.list_of_objects if obj.blocked]
def detect_collision(self, dx, dy):
next_rect = self.rect.copy()
next_rect.move_ip(dx, dy)
hit_indexes = next_rect.collidelistall(self.collision_list)
if len(hit_indexes):
delta_x, delta_y = 0, 0
for hit_index in hit_indexes:
hit_rect = self.collision_list[hit_index]
if dx > 0:
delta_x += next_rect.right - hit_rect.left
else:
delta_x += hit_rect.right - next_rect.left
if dy > 0:
delta_y += next_rect.bottom - hit_rect.top
else:
delta_y += hit_rect.bottom - next_rect.top
if abs(delta_x - delta_y) < 10:
dx, dy = 0, 0
elif delta_x > delta_y:
dy = 0
elif delta_y > delta_x:
dx = 0
self.x += dx
self.y += dy
def movement(self):
self.keys_control()
self.mouse_control()
self.rect.center = self.x, self.y
self.angle %= DOUBLE_PI
80
ЧДТУ.24 2211-002 2
def keys_control(self):
sin_a = math.sin(self.angle)
cos_a = math.cos(self.angle)
keys = pygame.key.get_pressed()
if keys[pygame.K_ESCAPE]:
exit()
if keys[pygame.K_w]:
dx = player_speed * cos_a
dy = player_speed * sin_a
self.detect_collision(dx, dy)
if keys[pygame.K_s]:
dx = -player_speed * cos_a
dy = -player_speed * sin_a
self.detect_collision(dx, dy)
if keys[pygame.K_a]:
dx = player_speed * sin_a
dy = -player_speed * cos_a
self.detect_collision(dx, dy)
if keys[pygame.K_d]:
dx = -player_speed * sin_a
dy = player_speed * cos_a
self.detect_collision(dx, dy)
if keys[pygame.K_LEFT]:
self.angle -= 0.02
if keys[pygame.K_RIGHT]:
self.angle += 0.02
for event in pygame.event.get():
if event.type == pygame.QUIT:
exit()
if event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1 and not self.shot:
self.shot = True
def mouse_control(self):
if pygame.mouse.get_focused():
difference = pygame.mouse.get_pos()[0] - HALF_WIDTH
pygame.mouse.set_pos((HALF_WIDTH, HALF_HEIGHT))
self.angle += difference * self.sensitivity
Файл ray_casting.py
import pygame
from settings import *
from map import world_map, WORLD_WIDTH, WORLD_HEIGHT
from numba import njit
@njit(fastmath=True, cache=True)
def mapping(a, b):
80
ЧДТУ.24 2211-002 2
return int(a // TILE) * TILE, int(b // TILE) * TILE
@njit(fastmath=True, cache=True)
def ray_casting(player_pos, player_angle, world_map):
casted_walls = []
ox, oy = player_pos
texture_v, texture_h = 1, 1
xm, ym = mapping(ox, oy)
cur_angle = player_angle - HALF_FOV
for ray in range(NUM_RAYS):
sin_a = math.sin(cur_angle)
sin_a = sin_a if sin_a else 0.000001
cos_a = math.cos(cur_angle)
cos_a = cos_a if cos_a else 0.000001
# verticals
x, dx = (xm + TILE, 1) if cos_a >= 0 else (xm, -1)
for i in range(0, WORLD_WIDTH, TILE):
depth_v = (x - ox) / cos_a
yv = oy + depth_v * sin_a
tile_v = mapping(x + dx, yv)
if tile_v in world_map:
texture_v = world_map[tile_v]
break
x += dx * TILE
# horizontals
y, dy = (ym + TILE, 1) if sin_a >= 0 else (ym, -1)
for i in range(0, WORLD_HEIGHT, TILE):
depth_h = (y - oy) / sin_a
xh = ox + depth_h * cos_a
tile_h = mapping(xh, y + dy)
if tile_h in world_map:
texture_h = world_map[tile_h]
break
y += dy * TILE
# projection
depth, offset, texture = (depth_v, yv, texture_v) if depth_v < depth_h else (depth_h, xh,
texture_h)
offset = int(offset) % TILE
depth *= math.cos(player_angle - cur_angle)
depth = max(depth, 0.00001)
proj_height = int(PROJ_COEFF / depth)
casted_walls.append((depth, offset, proj_height, texture))
cur_angle += DELTA_ANGLE
return casted_walls
80
ЧДТУ.24 2211-002 2
def ray_casting_walls(player, textures):
casted_walls = ray_casting(player.pos, player.angle, world_map)
wall_shot = casted_walls[CENTER_RAY][0], casted_walls[CENTER_RAY][2]
walls = []
for ray, casted_values in enumerate(casted_walls):
depth, offset, proj_height, texture = casted_values
if proj_height > HEIGHT:
coeff = proj_height / HEIGHT
texture_height = TEXTURE_HEIGHT / coeff
wall_column = textures[texture].subsurface(offset * TEXTURE_SCALE,
HALF_TEXTURE_HEIGHT - texture_height // 2,
TEXTURE_SCALE, texture_height)
wall_column = pygame.transform.scale(wall_column, (SCALE, HEIGHT))
wall_pos = (ray * SCALE, 0)
else:
wall_column = textures[texture].subsurface(offset * TEXTURE_SCALE, 0,
TEXTURE_SCALE, TEXTURE_HEIGHT)
wall_column = pygame.transform.scale(wall_column, (SCALE, proj_height))
wall_pos = (ray * SCALE, HALF_HEIGHT - proj_height // 2)
walls.append((depth, wall_column, wall_pos))
return walls, wall_shot
Файл settings.py
import math
# game settings
WIDTH = 1200
HEIGHT = 800
HALF_WIDTH = WIDTH // 2
HALF_HEIGHT = HEIGHT // 2
PENTA_HEIGHT = 5 * HEIGHT
DOUBLE_HEIGHT = 2 * HEIGHT
FPS = 60
TILE = 100
FPS_POS = (WIDTH - 65, 5)
# minimap settings
MINIMAP_SCALE = 5
MINIMAP_RES = (WIDTH // MINIMAP_SCALE, HEIGHT // MINIMAP_SCALE)
MAP_SCALE = 2 * MINIMAP_SCALE # 1 -> 12 x 8, 2 -> 24 x 16, 3 -> 36 x 24
MAP_TILE = TILE // MAP_SCALE
MAP_POS = (0, HEIGHT - HEIGHT // MINIMAP_SCALE)
# ray casting settings
FOV = math.pi / 3
HALF_FOV = FOV / 2
NUM_RAYS = 300
MAX_DEPTH = 800
DELTA_ANGLE = FOV / NUM_RAYS
80
ЧДТУ.24 2211-002 2
DIST = NUM_RAYS / (2 * math.tan(HALF_FOV))
PROJ_COEFF = 3 * DIST * TILE
SCALE = WIDTH // NUM_RAYS
# sprite settings
DOUBLE_PI = math.pi * 2
CENTER_RAY = NUM_RAYS // 2 - 1
FAKE_RAYS = 100
FAKE_RAYS_RANGE = NUM_RAYS - 1 + 2 * FAKE_RAYS
# texture settings (1200 x 1200)
TEXTURE_WIDTH = 1200
TEXTURE_HEIGHT = 1200
HALF_TEXTURE_HEIGHT = TEXTURE_HEIGHT // 2
TEXTURE_SCALE = TEXTURE_WIDTH // TILE
# player settings
player_pos = (HALF_WIDTH // 4, HALF_HEIGHT - 50)
player_angle = 0
player_speed = 3
# colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (220, 0, 0)
GREEN = (0, 80, 0)
BLUE = (0, 0, 255)
DARKGRAY = (40, 40, 40)
PURPLE = (120, 0, 120)
SKYBLUE = (0, 186, 255)
YELLOW = (220, 220, 0)
SANDY = (244, 164, 96)
DARKBROWN = (97, 61, 25)
DARKORANGE = (255, 140, 0)
Файл sprite_objects.py
import pygame
from settings import *
from collections import deque
from ray_casting import mapping
from numba.core import types
from numba.typed import Dict
from numba import int32
class Sprites:
def __init__(self):
self.sprite_parameters = {
'sprite_barrel': {
'sprite': pygame.image.load('sprites/barrel/base/0.png').convert_alpha(),
80
ЧДТУ.24 2211-002 2
'viewing_angles': None,
'shift': 1.8,
'scale': (0.4, 0.4),
'side': 30,
'animation': deque(
[pygame.image.load(f'sprites/barrel/anim/{i}.png').convert_alpha() for i in
range(12)]),
'death_animation': deque([pygame.image.load(f'sprites/barrel/death/{i}.png')
.convert_alpha() for i in range(4)]),
'is_dead': None,
'dead_shift': 2.6,
'animation_dist': 800,
'animation_speed': 10,
'blocked': True,
'flag': 'decor',
'obj_action': []
},
'sprite_pin': {
'sprite': pygame.image.load('sprites/pin/base/0.png').convert_alpha(),
'viewing_angles': None,
'shift': 0.6,
'scale': (0.6, 0.6),
'side': 30,
'animation': deque([pygame.image.load(f'sprites/pin/anim/{i}.png').convert_alpha()
for i in range(8)]),
'death_animation': [],
'is_dead': 'immortal',
'dead_shift': None,
'animation_dist': 800,
'animation_speed': 10,
'blocked': True,
'flag': 'decor',
'obj_action': []
},
'sprite_flame': {
'sprite': pygame.image.load('sprites/flame/base/0.png').convert_alpha(),
'viewing_angles': None,
'shift': 0.7,
'scale': (0.6, 0.6),
'side': 30,
'animation': deque(
[pygame.image.load(f'sprites/flame/anim/{i}.png').convert_alpha() for i in
range(16)]),
'death_animation': [],
'is_dead': 'immortal',
'dead_shift': 1.8,
'animation_dist': 1800,
'animation_speed': 5,
'blocked': None,
80
ЧДТУ.24 2211-002 2
'flag': 'decor',
'obj_action': []
},
'npc_devil': {
'sprite': [pygame.image.load(f'sprites/devil/base/{i}.png').convert_alpha() for i in
range(8)],
'viewing_angles': True,
'shift': 0.0,
'scale': (1.1, 1.1),
'side': 50,
'animation': [],
'death_animation': deque([pygame.image.load(f'sprites/devil/death/{i}.png')
.convert_alpha() for i in range(6)]),
'is_dead': None,
'dead_shift': 0.6,
'animation_dist': None,
'animation_speed': 10,
'blocked': True,
'flag': 'npc',
'obj_action': deque(
[pygame.image.load(f'sprites/devil/anim/{i}.png').convert_alpha() for i in range(9)]),
},
'sprite_door_v': {
'sprite': [pygame.image.load(f'sprites/doors/door_v/{i}.png').convert_alpha() for i in
range(16)],
'viewing_angles': True,
'shift': 0.1,
'scale': (2.6, 1.2),
'side': 100,
'animation': [],
'death_animation': [],
'is_dead': 'immortal',
'dead_shift': 0,
'animation_dist': 0,
'animation_speed': 0,
'blocked': True,
'flag': 'door_h',
'obj_action': []
},
'sprite_door_h': {
'sprite': [pygame.image.load(f'sprites/doors/door_h/{i}.png').convert_alpha() for i in
range(16)],
'viewing_angles': True,
'shift': 0.1,
'scale': (2.6, 1.2),
'side': 100,
'animation': [],
'death_animation': [],
'is_dead': 'immortal',
80
ЧДТУ.24 2211-002 2
'dead_shift': 0,
'animation_dist': 0,
'animation_speed': 0,
'blocked': True,
'flag': 'door_v',
'obj_action': []
},
'npc_soldier0': {
'sprite': [pygame.image.load(f'sprites/npc/soldier0/base/{i}.png').convert_alpha() for i
in range(8)],
'viewing_angles': True,
'shift': 0.8,
'scale': (0.4, 0.6),
'side': 30,
'animation': [],
'death_animation': deque([pygame.image.load(f'sprites/npc/soldier0/death/{i}.png')
.convert_alpha() for i in range(10)]),
'is_dead': None,
'dead_shift': 1.7,
'animation_dist': None,
'animation_speed': 6,
'blocked': True,
'flag': 'npc',
'obj_action': deque([pygame.image.load(f'sprites/npc/soldier0/action/{i}.png')
.convert_alpha() for i in range(4)])
},
}
self.list_of_objects = [
SpriteObject(self.sprite_parameters['sprite_barrel'], (7.1, 2.1)),
SpriteObject(self.sprite_parameters['sprite_barrel'], (5.9, 2.1)),
SpriteObject(self.sprite_parameters['sprite_pin'], (8.7, 2.5)),
SpriteObject(self.sprite_parameters['npc_devil'], (7, 4)),
SpriteObject(self.sprite_parameters['sprite_flame'], (8.6, 5.6)),
SpriteObject(self.sprite_parameters['sprite_door_v'], (3.5, 3.5)),
SpriteObject(self.sprite_parameters['sprite_door_h'], (1.5, 4.5)),
SpriteObject(self.sprite_parameters['npc_soldier0'], (2.5, 1.5)),
SpriteObject(self.sprite_parameters['npc_soldier0'], (5.51, 1.5)),
SpriteObject(self.sprite_parameters['npc_soldier0'], (6.61, 2.92)),
SpriteObject(self.sprite_parameters['npc_soldier0'], (7.68, 1.47)),
SpriteObject(self.sprite_parameters['npc_soldier0'], (8.75, 3.65)),
SpriteObject(self.sprite_parameters['npc_soldier0'], (1.27, 11.5)),
SpriteObject(self.sprite_parameters['npc_soldier0'], (1.26, 8.29)),
]
@property
def sprite_shot(self):
return min([obj.is_on_fire for obj in self.list_of_objects], default=(float('inf'), 0))
80
ЧДТУ.24 2211-002 2
@property
def blocked_doors(self):
blocked_doors = Dict.empty(key_type=types.UniTuple(int32, 2), value_type=int32)
for obj in self.list_of_objects:
if obj.flag in {'door_h', 'door_v'} and obj.blocked:
i, j = mapping(obj.x, obj.y)
blocked_doors[(i, j)] = 0
return blocked_doors
class SpriteObject:
def __init__(self, parameters, pos):
self.object = parameters['sprite'].copy()
self.viewing_angles = parameters['viewing_angles']
self.shift = parameters['shift']
self.scale = parameters['scale']
self.animation = parameters['animation'].copy()
# ---------------------
self.death_animation = parameters['death_animation'].copy()
self.is_dead = parameters['is_dead']
self.dead_shift = parameters['dead_shift']
# ---------------------
self.animation_dist = parameters['animation_dist']
self.animation_speed = parameters['animation_speed']
self.blocked = parameters['blocked']
self.flag = parameters['flag']
self.obj_action = parameters['obj_action'].copy()
self.x, self.y = pos[0] * TILE, pos[1] * TILE
self.side = parameters['side']
self.dead_animation_count = 0
self.animation_count = 0
self.npc_action_trigger = False
self.door_open_trigger = False
self.door_prev_pos = self.y if self.flag == 'door_h' else self.x
self.delete = False
if self.viewing_angles:
if len(self.object) == 8:
self.sprite_angles = [frozenset(range(338, 361)) | frozenset(range(0, 23))] + \
[frozenset(range(i, i + 45)) for i in range(23, 338, 45)]
else:
self.sprite_angles = [frozenset(range(348, 361)) | frozenset(range(0, 11))] + \
[frozenset(range(i, i + 23)) for i in range(11, 348, 23)]
self.sprite_positions = {angle: pos for angle, pos in zip(self.sprite_angles, self.object)}
@property
def is_on_fire(self):
if CENTER_RAY - self.side // 2 < self.current_ray < CENTER_RAY + self.side // 2 and
self.blocked:
return self.distance_to_sprite, self.proj_height
80
ЧДТУ.24 2211-002 2
return float('inf'), None
@property
def pos(self):
return self.x - self.side // 2, self.y - self.side // 2
def object_locate(self, player):
dx, dy = self.x - player.x, self.y - player.y
self.distance_to_sprite = math.sqrt(dx ** 2 + dy ** 2)
self.theta = math.atan2(dy, dx)
gamma = self.theta - player.angle
if dx > 0 and 180 <= math.degrees(player.angle) <= 360 or dx < 0 and dy < 0:
gamma += DOUBLE_PI
self.theta -= 1.4 * gamma
delta_rays = int(gamma / DELTA_ANGLE)
self.current_ray = CENTER_RAY + delta_rays
if self.flag not in {'door_h', 'door_v'}:
self.distance_to_sprite *= math.cos(HALF_FOV - self.current_ray * DELTA_ANGLE)
fake_ray = self.current_ray + FAKE_RAYS
if 0 <= fake_ray <= FAKE_RAYS_RANGE and self.distance_to_sprite > 30:
self.proj_height = min(int(PROJ_COEFF / self.distance_to_sprite),
DOUBLE_HEIGHT if self.flag not in {'door_h', 'door_v'} else HEIGHT)
sprite_width = int(self.proj_height * self.scale[0])
sprite_height = int(self.proj_height * self.scale[1])
half_sprite_width = sprite_width // 2
half_sprite_height = sprite_height // 2
shift = half_sprite_height * self.shift
# logic for doors, npc, decor
if self.flag in {'door_h', 'door_v'}:
if self.door_open_trigger:
self.open_door()
self.object = self.visible_sprite()
sprite_object = self.sprite_animation()
else:
if self.is_dead and self.is_dead != 'immortal':
sprite_object = self.dead_animation()
shift = half_sprite_height * self.dead_shift
sprite_height = int(sprite_height / 1.3)
elif self.npc_action_trigger:
sprite_object = self.npc_in_action()
else:
self.object = self.visible_sprite()
sprite_object = self.sprite_animation()
80
ЧДТУ.24 2211-002 2
# sprite scale and pos
sprite_pos = (self.current_ray * SCALE - half_sprite_width, HALF_HEIGHT -
half_sprite_height + shift)
sprite = pygame.transform.scale(sprite_object, (sprite_width, sprite_height))
return (self.distance_to_sprite, sprite, sprite_pos)
else:
return (False,)
def sprite_animation(self):
if self.animation and self.distance_to_sprite < self.animation_dist:
sprite_object = self.animation[0]
if self.animation_count < self.animation_speed:
self.animation_count += 1
else:
self.animation.rotate()
self.animation_count = 0
return sprite_object
return self.object
def visible_sprite(self):
if self.viewing_angles:
if self.theta < 0:
self.theta += DOUBLE_PI
self.theta = 360 - int(math.degrees(self.theta))
for angles in self.sprite_angles:
if self.theta in angles:
return self.sprite_positions[angles]
return self.object
def dead_animation(self):
if len(self.death_animation):
if self.dead_animation_count < self.animation_speed:
self.dead_sprite = self.death_animation[0]
self.dead_animation_count += 1
else:
self.dead_sprite = self.death_animation.popleft()
self.dead_animation_count = 0
return self.dead_sprite
def npc_in_action(self):
sprite_object = self.obj_action[0]
if self.animation_count < self.animation_speed:
self.animation_count += 1
else:
self.obj_action.rotate()
self.animation_count = 0
return sprite_object
80
ЧДТУ.24 2211-002 2
def open_door(self):
if self.flag == 'door_h':
self.y -= 3
if abs(self.y - self.door_prev_pos) > TILE:
self.delete = True
elif self.flag == 'door_v':
self.x -= 3
if abs(self.x - self.door_prev_pos) > TILE:
self.delete = True
80
ДОДАТОК В
ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ КОМП'ЮТЕРНОЇ ГРИ BUTTERFLY
Інструкція користувача
482.ЧДТУ.242211 34-02
Листів 4
Розробник ________________ В.М. Гладкий
Черкаси 2024
482.ЧДТУ.242211 34-03
Інтерфейс користувача "Butterfly" розроблений з урахуванням
зручності та інтуїтивної зрозумілості для гравців. Основні компоненти
інтерфейсу включають головне меню, ігровий інтерфейс, налаштування та
екран збереження/завантаження гри
Первинний вид програми після запуску
Після запуску програми користувач бачить головний інтерфейс
програми, що складається з конопок початку, назви гри та виходу з неї(Рис.
3.5).
Рисунок В1 – Інтерфейс гри «Butterfly»
Після того, як гравець натисне кнопку Start, він почне гру та з’явиться на
спавні, тобто на початку рівня (Рис. В1).
100
482.ЧДТУ.242211 34-03
Рисунок В2 – Початок гри «Butterfly»
Проходження гри
Для того, щоб пройти гру, гравцеві потрібно вбити всих монстрів
―NPC‖ (Рис.В2).
101
482.ЧДТУ.242211 34-03
Рисунок В3– Процес знищення NPC в грі «Butterfly»
Перемога в грі
Після того, як гравець знищить всіх NPC, на екрані буде написано YOU
WIN!!! (Рис.В3).
102
482.ЧДТУ.242211 34-03
Рисунок В4– Перемога в грі«Butterfly»
103
ДОДАТОК Г
ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ КОМП'ЮТЕРНОЇ ГРИ BUTTERFLY
Графічні матеріали
482.ЧДТУ.242211 90-02
Листів 8
Розробник ________________ В.М. Гладкий
Черкаси 2024
482.ЧДТУ.242211 90-03
3
Рисунок Г.1 – Слайд 1
Рисунок Г.2 – Слайд 2
104
482.ЧДТУ.242211 90-03
3
Рисунок Г.3 – Слайд 3
Рисунок Г.4 – Слайд 4
105
482.ЧДТУ.242211 90-03
3
Рисунок Г.5 – Слайд 5
Рисунок Г.6 – Слайд 6
106
482.ЧДТУ.242211 90-03
3
Рисунок Г.7 – Слайд 7
Рисунок Г.8 – Слайд 8
107
482.ЧДТУ.242211 90-03
3
Рисунок Г.9 – Слайд 9
Рисунок Г.10 – Слайд 10
108
482.ЧДТУ.242211 90-03
3
Рисунок Г.11 – Слайд 11
Рисунок Г.12 – Слайд 12
109
482.ЧДТУ.242211 90-03
3
Рисунок Г.13 – Слайд 13
Рисунок Г.14 – Слайд 14
110
482.ЧДТУ.242211 90-03
3
Рисунок Г.15 – Слайд 15
111