Безкоштовно

Створення гри у жанрі 2D платформера

views 64

Курсова робота з ООП

на тему “Створення гри у жанрі 2D платформера”

ВСТУП

Сьогодні існує дуже багато способів розважитися та добре провести час. Одним із таких способів є ігри. Оскільки в наш час сучасних технологій комп’ютери дуже поширені та доступні майже кожному, набули великої популярності саме комп’ютерні ігри. За останні роки їх створили дуже багато від найпростіших до таких складних які моделюють реальний світ. Проте не дивлячись на те, що існує таке різноманіття усіляких жанрів, зараз дуже складно знайти гарну гру. Сучасні люди дуже зайняті та не мають часу аби годинами сидіти та проходити якусь гру. Також такі ігри не дозволяють розслабитися, через те що в них забагато дій, за всім потрібно слідкувати і виходить, що замість того аби розслабитися людина провела весь час у напруженому стані і тільки втомилася. Також не дивлячись на кількість ігор, вони усі одноманітні, їх вже нецікаво проходити. Через це такі складні ігри більше не цікавлять людей. Тепер все більше людей цікавиться невеличкими, але дуже простими іграми. Такі ігри не займають багато місця, в них можна пограти під час невеличкої перерви, чи після роботи. Вони не мають якогось складного сюжету, чи графіки, все робиться якомога простіше. Графіка на відміну від реального життя, більше схожа на мультфільм. Це дозволяє людині дійсно розслабитися і приємно провести час.

В даній роботі створюється гра у жанрі 2D платформера. Проте не дивлячись на те, що такі ігри були ще десять років тому, ця гра використовує новий підхід до створення рівнів, що робить її новою та цікавою. В неї буде приємно грати на протязі тривалого часу.

1 Теоретичні відомості

1.2 2D платформер та його аналоги

2D платформер – це один із найпопулярніших жанрів 2D гри.  В основному у грі використовується вид збоку, рідше – зверху.  В таких іграх гравець мусить проходити рівні, які складаються з різних «платформ». На рівнях розташовані різні монстри та бонуси. Самою першою та найпопулярнішою грою цього жанру була гра Super Mario.  Не дивлячись на те, що найперша гра цього жанру вийшла у 1983 році, я вирішив використовувати саме цей жанр, але у дещо незвичному стилі. У 2009 році була створена гра яку неможливо було пройти, через те, що вона ніколи не закінчувалася. У грі лише один рівень, проте він постійно видозмінюється. Саме ця нова ідея робить гру цікавою.

Існує три досить непоганих гри, які ґрунтуються на цій ідеї.

Перша це PapiJump (рис.1.2.1), досить проста, проте не менш цікава гра.  Це найперша гра, у якій була реалізована ідея нескінченного рівня. Проте у грі лише головний герой, та три види «платформ» по яким пересувається гравець. Через це одноманіття в неї важко довго грати та вона швидко набридає.

Рисунок 1.2.1 – PapiJump

Переваги: цікава та нова ідея, приємна графіка.

Недоліки: одноманітність ігрового процесу.

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

Рисунок 1.2.2 – MegaJump

Переваги: дуже приємна графіка, велика кількість бонусів.

Недоліки: складність проходження гри, через залежність від монеток.

І нарешті третя гра, на мою думку найкраща з них – це Doodle Jump (рис.1.2.3). Саме ця гра надихнула мене на створення гри саме цього жанру.

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

Рисунок 1.2.3 – Doodle Jump

Переваги: збалансованість гри, різноманітність блоків.

Недоліки: непродумана система бонусів.

Опираючись на проведений аналіз існуючих аналогів, я вирішив зробити гру, яка буде поєднувати їх переваги, та намагатимуся виправити їх недоліки. Буде розроблена гра з використанням багатопоточності, це дозволить уникнути багатьох технічних труднощів при створенні гри такого типу. У грі буде нескінченний рівень, який буде генеруватися під час проходження гри з блоків, які заздалегідь будуть створені та збережені у файлах. Головний персонаж буде постійно рухатися вгору, гравець зможе лише керувати рухом вліво та вправо. Також у грі будуть бонуси у вигляді монеток, які можна збирати, та потім за них у спеціальному ігровому магазині придбати різні речі. В магазині буде доступний гелікоптер, ракета та захисне поле, яке дасть ще один шанс продовжити гру при падінні. Така система дозволить гравцю у необхідний момент скористатися магазином, на відміну від інших ігор де такі речі розташовуються навмання та часто коли потрібно їх не дістати.

1.2 Мова програмування Java.

Я буду розробляти гру на об’єктна-орієнтованій мові. Найкраще з усіх до моєї задачі підходить мова Java. Вона дає усі необхідні інструменти для реалізації задуманої гри.

Java — об’єктно-орієнтована мова програмування, випущена компанією Sun Microsystems у 1995 році як основний компонент платформи Java. Синтаксис мови багато в чому походить від C та C++. У офіційній реалізації, Java програми компілюються у байткод, який при виконанні інтерпретується віртуальною машиною для конкретної платформи.

Java є суворо типізованою мовою, кожна змінна та вираз має тип, відомий на етапі компіляції.

Типи мови Java належать до двох категорій: прості (primitive) та вказівникові (reference). До простих типів належить булевий(логічний) тип, числові типи та символьний тип.

Числові типи складаються із цілих типів byte, short, int, long та дійсних типів float, double. Символьний тип представлений типом char. Вказівникові типи складаються із класів, інтерфейсів, масивів. Значенням вказівникового типу є вказівник на об’єкт — екземпляр класу чи масиву. Рядки є об’єктами класу String.

Віртуальна машина Java — набір комп’ютерних програм та структур даних, що використовують модель віртуальної машини для виконання інших комп’ютерних програм чи скриптів.

JVM використовує байткод Java, який як правило, але не завжди генерується з вихідних кодів мови програмування Java; віртуальну машину також застосовують для виконання коду, згенерованого з інших мов програмування. Наприклад, вихідний код Ada можна скомпілювати у Java байткод.

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

Мова значно запозичила синтаксис із C і C++. Зокрема, взято за основу об’єктну модель С++, проте її модифіковано. Усунуто можливість появи деяких конфліктних ситуацій, що могли виникнути через помилки програміста та полегшено сам процес розробки об’єктно-орієнтованих програм. Ряд дій, які в С/C++ повинні здійснювати програмісти, доручено віртуальній машині. Передусім, Java розроблялась як платформо-незалежна мова, тому вона має менше низькорівневих можливостей для роботи з апаратним забезпеченням. За необхідності таких дій java дозволяє викликати підпрограми, написані іншими мовами програмування.

Програма, написана на мові Java, працюватиме на будь-якій підтримуваній апаратній чи системній платформі без змін у початковому коді та перекомпіляції.

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

Стандартні бібліотеки забезпечують загальний спосіб доступу до таких платформозалежних особливостей, як обробка графіки, багатопотоковість та роботу з мережами. У деяких версіях задля збільшення продуктивності JVM, байт-код можна компілювати у машинний код до або під час виконання програми.

Основна перевага використання байт-коду — це портативність. Тим не менш, додаткові витрати на інтерпретацію означають, що інтерпретовані програми будуть майже завжди працювати повільніше, ніж скомпільовані у машинний код, і саме тому Java одержала репутацію «повільної» мови. Проте, цей розрив суттєво скоротився після введення декількох методів оптимізації у сучасних реалізаціях JVM.

Одним із таких методів є англ. just-in-time (JIT) компіляція, що перетворює Java байт-код у машинний під час першого запуску програми, а потім кешує його. У результаті, така програма запускається і виконується швидше, ніж простий інтерпретований код, але ціною додаткових витрат на компіляцію під час виконання. Складніші віртуальні машини також використовують динамічну рекомпіляцію, яка полягає в тому, що В. М. аналізує поведінку запущеної програми й вибірково рекомпілює та оптимізує певні її частини. З використанням динамічної рекомпіляції можна досягти більшого рівня оптимізації, ніж за статичної компіляції, оскільки динамічний компілятор може робити оптимізації на базі знань про довкілля періоду виконання та про завантажені класи. До того ж, він може виявляти так звані гарячі точки (англ. hot spots) —- частини програми, найчастіше внутрішні цикли, які займають найбільше часу при виконанні. JIT компіляція та динамічна рекомпіляція збільшує швидкість Java програм, не втрачаючи при цьому портативності.

Існує ще одна технологія оптимізації байткоду, широко відома як статична компіляція, або англ. ahead-of-time (AOT) компіляція. Цей метод передбачає, як і традиційні компілятори, безпосередню компіляцію у машинний код. Це забезпечує хороші показники в порівнянні з інтерпретацією, але за рахунок втрати переносності: скомпільовану таким способом програму можна запустити тільки на одній, цільовій платформі.

На противагу C++, Java об’єктно-орієнтованіша. Всі дані і дії групуються в класи об’єктів. Виключенням з повної об’єктності (як скажімо в Smalltalk) є примітивні типи (int, float тощо). Це було свідомим рішенням проектувальників мови задля збільшення швидкості. Через це, Java не вважається повністю об’єктно-орієнтовною мовою.

У Java всі об’єкти є похідними від головного об’єкта (він називається просто Object), з якого вони успадковують базову поведінку і властивості.

Хоча у C++ вперше стало доступне множинне успадкування, але у Java можливе тільки одинарне успадкування, завдяки чому виключається можливість конфліктів між членами класу(методи і змінні), які успадковуються від базових класів.

У намірах проектувальників Java мала замінити C++ — об’єктного наступника мови C.  Проектувальники почали з аналізу властивостей C++, які є причиною найбільшого числа помилок, щоби створити просту, безпечну і безвідмовну мову програмування.

В Java існує система винятків або ситуацій, коли програма зустрічається з неочікуваними труднощами, наприклад:

  • операції над елементом масиву поза його межами або над порожнім елементом
  • читання з недоступного каталогу або неправильної адреси URL
  • ввід недопустимих даних користувачем

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

Проте, мову програмування Java не рекомендується використовувати в системах, збій в роботі яких може призвести до смерті, травм чи значних фізичних ушкоджень (наприклад, програмне забезпечення для керування атомними електростанціями, польотами, систем життєзабезпечення чи систем озброєння) через ненадійність програм, написаних на мові програмування Java.

Java використовує автоматичний збирач сміття для керування пам’яттю під час життєвого циклу об’єкта. Програміст вирішує, коли створювати об’єкти, а віртуальна машина відповідальна за звільнення пам’яті після того, як об’єкт стає непотрібним. Коли до певного об’єкта вже не залишається посилань, збирач сміття може автоматично прибирати його із пам’яті. Проте, витік пам’яті все ж може статися, якщо код, написаний програмістом, має посилання на вже непотрібні об’єкти, наприклад на об’єкти, що зберігаються у діючих контейнерах.

Прибирання сміття дозволене у будь-який час. В ідеалі воно відбувається під час бездіяльності програми. Збірка сміття автоматично форсується при

нестачі вільної пам’яті в купі для розміщення нового об’єкта, що може призводити до кілька секундного зависання. Тому існують реалізації віртуальної машини Java з прибиральником сміття спеціально створеним для програмування систем реального часу.

Java не має підтримки вказівників у стилі C/C++. Це зроблено задля безпеки й надійності, аби дозволити збирачу сміття переміщувати вказівникові об’єкти.

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

Суттю багатониттєвості є квазі-багатозадачність на рівні одного виконуваного процесу, тобто всі ниті виконуються в адресному просторі процесу. Окрім цього, всі ниті процесу мають не тільки спільний адресний простір, але і спільні дескриптори файлів. Процес, що виконується, має як мінімум одну (головну) нить.

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

Переваги в багатониттєвості такі:

  • Спрощення програми в деяких випадках, за рахунок використання загального адресного простору
  • Менші відносно процесу часові витрати на створення ниті і взаємодію між нитями
  • Підвищення продуктивності процесу за рахунок розпаралелювання процесорних обчислень і операцій вводу/виводу

Об’єктно-орієнтоване програмування (ООП) — одна з парадигм програмування, яка розглядає програму як множину «об’єктів», що взаємодіють між собою. В ній використано декілька технологій від попередніх парадигм, зокрема успадкування, модульність, поліморфізм та інкапсуляцію. Незважаючи на те, що ця парадигма з’явилась в 1960-тих роках, вона не мала широкого застосування до 1990-тих. Сьогодні багато мов програмування (зокрема, Java, C#, C++, Python, PHP, Ruby та Objective-C, ActionScript 3) підтримують ООП.

Об’єктно-орієнтоване програмування сягає своїм корінням до створення мови програмування Симула в 1960-тих роках, одночасно з посиленням дискусій про кризу програмного забезпечення. Разом із тим, як ускладнювалось апаратне та програмне забезпечення, було дуже важко зберегти якість програм. Об’єктно-орієнтоване програмування частково розв’язує цю проблему шляхом наголошення на модульності програми.

На відміну від традиційних поглядів, коли програму розглядали як набір підпрограм, або як перелік інструкцій комп’ютеру, ООП програми можна вважати сукупністю об’єктів. Відповідно до парадигми об’єктно-орієнтованого програмування, кожний об’єкт здатний отримувати повідомлення, обробляти дані, та надсилати повідомлення іншим об’єктам. Кожен об’єкт — своєрідний незалежний автомат з окремим призначенням та відповідальністю.

Також мені необхідно реалізувати діаграму класів.

Діаграма класів — статичне представлення структури моделі. Відображає статичні (декларативні) елементи, такі як: класи, типи даних, їх зміст та відношення. Діаграма класів, також, може містити позначення для пакетів та може містити позначення для вкладених пакетів. Також, діаграма класів може містити позначення деяких елементів поведінки, однак, їх динаміку розкрито в діаграмах інших типів.

Асоціація показує, що об’єкти однієї сутності (класу) пов’язані з об’єктами іншої сутності. Подвійні асоціації (з двома кінцями) представляються лінією, що з’єднує два класових блоку. Асоціації більш високого ступеня мають більше двох кінців і представляються лініями, один кінець яких йде до класового блоку, а інший до загального ромбики. У поданні односпрямованої асоціації додається стрілка, що вказує на напрям асоціації.
Асоціація може бути іменованої, і тоді на кінцях представляє її лінії будуть підписані ролі, приналежності, індикатори, мультиплікатори, видимості або інші властивості.

Агрегація – це різновид асоціації при відношенні між цілим і його частинами. Як тип асоціації агрегація може бути іменованої. Одне ставлення агрегації не може включати більше двох класів (контейнер і вміст).

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

Композиція – більш суворий варіант агрегації. Відома також як агрегація за значенням. Композиція має жорстку залежність часу існування примірників класу контейнера та примірників містяться класів. Якщо контейнер буде знищений, то всі його вміст буде також знищено.

Узагальнення (Generalization) показує, що один з двох зв’язаних класів (підтип) є приватною формою іншого (над типа), який називається узагальненням першого. На практиці це означає, що будь-який екземпляр підтипу є також примірником над типа. Наприклад: тварини – супертип ссавців, які, у свою чергу, – супертип приматів, і так далі.

Реалізація – відношення між двома елементами моделі, в якому один елемент (клієнт) реалізує поведінку, задане іншим (постачальником).

Залежність – це слабка форма відносини використання, при якому зміна в специфікації одного тягне за собою зміну іншого, причому протилежне не обов’язково. Виникає коли об’єкт виступає наприклад у формі параметра або локальної змінної. Графічно представляється пунктирною стрілкою, що йде від залежного елементу до того, від якого він залежить. Існує кілька іменованих варіантів. Залежність може бути між екземплярами, класами чи примірником та класом.

2 Програмна реалізація

2.1 Загальний опис програми

У цій грі існує лише один рівень і він ніколи не закінчується. Вся суть гри полягає в тому, аби набрати якомога більше очків. Головний персонаж завжди стрибає, гравець може лише контролювати його рух вліво чи вправо. Якщо під головним персонажем опиняється платформа, то в залежності від її типу гравець, або відштовхується, або падає (рис.2.1.1). Очки нараховуються за кожний новий блок якого досяг гравець, чим вище блок тим більше очків.

Рисунок 2.1.1 – Структура рівня у грі

Різні платформи мають різні властивості, наприклад, деякі платформи

коли на них стрибнути одразу  ж зникають, деякі зникають після того як персонаж відстрибує від неї, також я статичні та рухливі платформи, які можуть рухатися з різною швидкістю. Також інколи у грі трапляються монетки. Якщо їх збирати, то потім можна відкрити магазин (рис.2.1.2), не припиняючи гри, та придбати за них якийсь бонус. Є три види бонусів: щит, гелікоптер та ракета. Щит дає захист від падіння, гелікоптер піднімає гравця на протязі кількох секунд, ракета робить теж саме, що і гелікоптер, проте значно швидше.

Рисунок 2.1.2 – Ігровий магазин

2.2 Розробка діаграми класів

У ході роботи була спроектована діаграма класів створеної гри. Сама діаграма представлена у Додатку Б, нижче наведена зменшена копія.

2.3 Реалізація

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

class Main

Метод public static void main(String[] args) є головним методом у всій програмі та виконується одразу ж після запуску. Він відповідає за створення об’єкту класу TGame та запускає гру викликавши метод InitializeGameEngine().

· TGame NewGame – змінна, яка містить посилання на об’єкт класу TGame, який реалізує головну форму програми.

class TGame

Не дивлячись на те, що в цьому класі лише один метод, він є одним з головних класів у грі. Він успадковує клас JFrame. Через певні технічні складності при написанні гри мені довелося виводити зображення на форму у нескінченному циклі. Це дало мені змогу обійти обмеження стандартного таймеру у 1000 мілісекунд і отримати можливість викликати необхідні методи близько 1-1,5 мільйони разів на секунду. Завдяки цьому стало можливим пересування головного персонажу гри на потрібну відстань за потрібний час без візуальних дефектів. Переміщення відбувається плавно та швидко. Проте оскільки програма не може продовжувати роботу доки не завершить свою роботу цикл з відображення графіки. Ось тут і є головна складність, я не можу відслідковувати натиснення клавіш і реагувати на події. Тому я вирішив використовувати багато поточність у цій грі, це дозволить вирішити мою проблему. Я вирішив в основному потоці відслідковувати усі події, які допоможуть взаємодіяти з гравцем, а у паралельному потоці запустити нескінченний цикл з відображення графіки на форму.  Саме клас TGame відповідає за відстеження натиснення на клавіші клавіатури.

· JFrame mainframe1 – змінна, яка містить у собі посилання на головну форму програми, аби передати його у інший потік, для відображення на ній зображення.

public void InitializeGameEngine() – єдиний метод у класі TGame. Він відповідає за створення форми (робочої області, де буде відбуватися відображення усіх дії пов’язаних з грою). Спочатку створюється головна форма, після цього створюється обробник подій натиснення на клавіші клавіатури. Після цього створюється об’єкт класу TThreadKey, у конструктор передається посилання на форму і нарешті запускається паралельний потік, який відображає усе на екрані. Весь інший час обробник подій, відстежує натиснення клавіш користувачем та виконує певні дії. За допомогою клавіш виконується навігація по головному меню гри, управління головним персонажем та користування ігровим магазином.  Після натиснення якоїсь клавіші виконуються певні перевірки, та встановлюється значення якихось змінних. Взагалі оскільки майже вся гра прораховується та відображається у іншому класі і мені потрібно було передавати інструкції туди, я вирішив це робити за допомогою змінних, в основному типу Boolean. Це дуже полегшило керування грою. Наприклад, якщо мені потрібно було здвинути персонаж вліво, то я встановлював значення змінної left=true, і відслідковував стан цієї змінної у класі з грою.

class TThreadKey – цей клас успадковує клас Thread і є другим головним класом у грі. Він виконується у іншому потоці паралельно з основним. Проте не одночасно, особливостями багатопоточних програм є те, що потоки виконуються не одночасно, а послідовно. Спочатку виконується один потік, потім інший, причому слід зазначити, що потік може і не виконатися до кінця, а переключитися на виконання іншого і лише після цього продовжити виконання. Переключення між потоками здійснюється навмання, час їх роботи також не фіксований. Швидкість з якою відбувається переключення, а також те, що потік може не виконати усе одразу, створює відчуття, що потоки виконуються одночасно. Через це вони називаються паралельними. У конструктор класу передається посилання на форму, аби з цього класу можна була відображати малюнки на формі.

· JFrame lol – змінна, яка містить посилання на форму, для відображення на ній зображень.

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

1.     BufferedImage Fon.

2.     BufferedImage Fon1.

3.     BufferedImage Logo.

4.     BufferedImage Play1.

5.     BufferedImage Options1.

6.     BufferedImage Stats1.

7.     BufferedImage Exit1.

8.     BufferedImage Gam1.

9.     BufferedImage Gam2.

10. BufferedImage Play2.

11. BufferedImage Blockblue.

12. BufferedImage Options2.

13. BufferedImage Stats2.

14. BufferedImage Exit2.

15. BufferedImage Blockbrown.

16. BufferedImage Blockwhite.

17. BufferedImage IFon2.

18. BufferedImage IFon.

19. BufferedImage PlayerHH.

20. BufferedImage PlayerHH2.

21. BufferedImage PlayerRR.

22. BufferedImage PlayerRR2.

23. BufferedImage Scores.

24. BufferedImage BackFon.

25. BufferedImage PFon.

26. BufferedImage Gold.

27. BufferedImage helicopter.

28. BufferedImage rocket.

29. BufferedImage shield.

· TPlayer Player1 – змінна, яка містить посилання на об’єкт класу TPlayer, який відповідає за поведінку головного персонажу під час створення анімації у головному меню гри.

· TBlock Block1 – змінна у якій міститься посилання на об’єкт відповідальний за відображення платформи у головному меню гри.

· Font mfont – змінна, призначення якої збереження інформації про шрифт, розмір та інші атрибути.

· int dpx – змінная, яка зберігає у собі дані про положення головного персонажу по осі Х.

· int dd – відповідає за зміщення головного персонажу по осі Y.

· int menuu – зберігає у собі інформацію про те, де знаходиться зараз користувач у меню, чи підменю, та якому саме.

· int  pos – містить у собі інформацію про те, яку кнопку(графічну) вибрав користувач.

· boolean left – приймає значення true у випадку коли користувач натиснув клавішу стрілка вліво.

· boolean right – приймає значення true у випадку коли користувач натиснув клавішу стрілка вправо.

· BufferedImage FFon – містить у собі зображення на якому вимальовуються усі інші зображення та потім відображується на формі. Використовується для створення меню гри.

· TCScores Statistica – змінна, яка містить посилання на об’єкт класу TCScores, використовується для ведення статистики гри, завантаження та збереження її у файлах.

· ArrayList<IBlock> OBJ – змінна, яка містить посилання на динамічний масив, в якому зберігаються посилання на усі існуючі платформи у даний момент часу.

· ArrayList<TMoneta> Monets – відповідає за зберігання посилань на усі монети на рівні.

· ArrayList easylevels – містить список файлів, в яких зберігаються дані про усі прості блоки.

· ArrayList hardlevels – містить список файлів, в яких зберігаються дані про усі складні блоки.

· StringTokenizer TT – змінна, яка містить посилання на об’єкт класу StringTokenizer. Розбиває строки при завантажені блоків.

· Timer timer – містить посилання на таймер, використовується для зупинення дії гелікоптера.

· Timer timer2 – містить посилання на таймер, використовується для зупинення дії ракети.

· BufferedImage GFon – містить у собі зображення на якому вимальовуються усі інші зображення та потім відображується на формі. Використовується для створення самої гри.

· boolean draf – доки змінна містить значення true, відбувається відображення гри.

· boolean game – містить true, якщо користувач грає.

· boolean jomp – містить true, якщо головний персонаж зараз стрибає (здійснює рух вгору).

· boolean invent – відповідає за відображення ігрового магазину.

· boolean pause – відповідає за здійснення паузи у грі.

· boolean console – відповідає за ігрову консоль.

· boolean over – відповідає за завершення гри.

· boolean hardmode – містить значення true, якщо гра зараз у надважкому режимі.

· int oldhigh – визначає положення платформи на яку стрибнув гравець.

· int howhigh – визначає наскільки треба зсунути блоки вниз.

· int score – містить очки які набрав гравець.

· int lvlpos – відраховує пройдений шлях персонажем, кожні 500 пікселів генерується та завантажується новий блок.

· int gold – кількість монеток які зібрав гравець.

· int invpos – позиція виділеного елементу у меню.

· int jumps – кількість стрибків зроблених за всю гру.

· int jet – кількість використаних гелікоптерів за всю гру.

· int rock – кількість використаних ракет за всю гру.

· Random random – змінна, яка містить у собі навмання генероване число, використовується при виборі блоку для завантаження.

· TPlayer Gamer – містить посилання на об’єкт класу TPlayer, який відповідає за створення персонажу, його пересування.

· int top10[] – масив який містить інформацію про 10 найкращих результатів у грі.

public void run() – перевизначений метод, саме його викликає потік коли отримує посилання на цей клас. У цьому методі викликається інший метод DisplayMenu().

public int DisplayMenu() – цей метод є проміжним та слугує аби завантажувати усі необхідні для гри малюнки та графічні файли, створює сканер для завантаження та збереження даних у файл. Після цього створюється нескінченний цикл, який запускає метод TAnimateMenu() передаючи у нього посилання на малюнки, також робить затримку в одну мілісекунду (це робиться за для того, щоб регулювати швидкість всіх розрахунків та відображення процесу гри на формі).

public void TAnimateMenu(BufferedImage Fon, BufferedImage Fon1) – метод який відповідає за відображення меню та анімації у ньому. У якості аргументів у нього передаються два посилання на фонове зображення. При постійному нанесенні на форму зображень людське око бачить процес переходу від одного зображення до іншого і це створює неприємний ефект «мерехтіння». Аби уникнути цього візуального дефекту, я вирішив усі операції з зображеннями проводити у пам’яті, і лише після цього виводити остаточне зображення на форму. Тобто, спочатку я беру перший фоновий малюнок, та наношу на нього усі зображення, що мені потрібні і лише після цього вивожу його на форму, при усіх наступних запусках, аби прибрати попередні малюнки, на це зображення наноситься резервний фоновий малюнок і усе повторюється знову і знову. Ігрове меню поділено на кілька рівнів (головна частина, опції, статистика), в залежності від рівня меню виконуються ті чи інші дії. Також із файлу завантажуються дані про попередню статистику гравця і якщо необхідно вивести статистику на екран викликаємо метод displayStatistic(Graphics g) у об’єкта класу TCScores.

public int TParse(String ent) – проміжний метод, задля полегшення сприйняття коду. Отримує у якості аргументу строку, яку розбиває на дві частини та повертає числове значення однієї із них.

public void loadLevel(File level, int wtf) – метод, який відповідає за завантаження «блоків» із файлів. Хоча рівень у грі нескінченний та генерується навмання у процесі гри, все ж таки я вирішив, що буде краще дещо вдосконалити генерацію рівня. Оскільки при повністю довільному розташуванні можливі деякі казуси. Ось наприклад, можливе таке, що блоки будуть один на одному, можливо, що блоків буде або замало, або забагато, також може бути таке, що блоки розташуються на рівні таким чином, що неможливо буде дострибнути до верхніх блоків і гру неможливо буде продовжувати. Усі ці нюанси наштовхнули мене на ідею часткової генерації рівня. Я вирішив при генерації використовувати так звані «блоки» розміром 400х500 пікселів, які містять у собі вже розташовані платформи, це дає змогу генерувати рівень навмання, але при цьому він буде продуманий та збалансований. Ці блоки заздалегідь створені у редакторі блоків. Кількість таких блоків необмежена. Ще однією перевагою такого методу генерації рівня є те, що коли користувачеві набриднуть мої блоки, він зможе взяти редактор блоків та створити такі блоки, які йому заманеться. Метод отримує у якості аргументів посилання на файл з якого треба завантажити «блок» та число, яке позначає, як саме потрібно розмістити цей блок. Цей метод зчитує з файлу дані про об’єкти у цьому блоці, створює їх та додає посилання на них до динамічного масиву. Також в залежності від типу об’єкту, а також навмання генеруємого числа, цей метод вирішує ставити на ньому монетку чи ні. І у разі необхідності створює новий об’єкт класу TMoneta, та додає посилання на цей об’єкт у динамічний масив.

private void timerActionPerformed() і private void timerActionPerformed2()  методи, які припиняють дію бонусів придбаних у ігровому магазині.

public void TPlay() – найголовніший метод у цьому класі, він відповідає за проведення усіх необхідних розрахунків та відображення гри. Спочатку завантажується рівень, потім вимальовуються усі існуючі платформи. Після цього робиться перевірка координат головного персонажу та усіх монет, у випадку співпадіння монета зараховується на рахунок гравця та зникає з рівня.  За цим в залежності від того, чи є у головного персонажу якийсь бонус чи ні, викликається метод setJump() , який прораховує стрибок та виконує його.  За цим йдуть перевірки координаті платформ і персонажу та виконується стрибок, при чом враховується тип платформи, від деяких неможливо відштовхнутися, а деякі одразу ж після стрибка зникають. У випадку натиснення клавіш вліво чи вправо персонаж зміщується. Також тут у разі необхідності вмикається ігрова пауза чи відображується магазин. Після того, як пройдено один блок, навмання завантажується інший. Якщо платформа опускається нижче за 500 пікселів, то вона знищується, у випадку з головним персонажем припиняється гра, та оновлюється статистика. В цьому методі розраховується зміщення рівня в залежності від швидкості руху гравця, адже персонаж завжди стрибає вгору.

class TPlayer – клас який містить у собі усю інформацію про головного персонажа гри, та прораховує його стрибки.

·     protected int pos_x – містить положення персонажу по осі Х.

·     protected int pos_y – містить положення персонажу по осі У.

·     protected int size_x – розмір картинки персонажу по осі Х.

·     protected int size_y – розмір картинки персонажу по осі У.

·     protected int jump – відповідає за висоту стрибка.

·     protected int fall – відповідає за швидкість падіння.

·     protected boolean down – якщо містить значення true, то персонаж рухається вгору, якщо false – то вниз.

·     protected BufferedImage TImage – містить посилання на зображення гравця.

public void setPosition(int posX, int posY) – метод який встановлює координати головного персонажу, у якості аргументів передається положення по осі Х та У.

public int getPosX() – повертає положення персонажу по осі Х.

public int getPosY() – повертає положення по осі У.

public void setJump(int xXx) – метод, який у якості аргументу отримує тип здійснюваного стрибка, робить усі розрахунки та робить зміщення персонажу.

class TMoneta – клас, у якому містяться усі дані про кожну монету на рівні, в ньому реалізуються усі необхідні методи для роботи з монетами.

·     protected int posx – положення монети по осі Х.

·     protected int posy – положення монети по осі У.

·     protected int sizex – розмір монети вздовж осі Х.

·     protected int sizey – розмір монети вздовж осі У.

·     protected BufferedImage TImage – містить посилання на     зображення монети.

public void setPos(int posX, int posY) – встановлює положення монети у просторі.

public int getPosX() – повертає положення монети по осі Х.

public int getPosY() – повертає положення монети по осі У.

public BufferedImage getImage() – повертає посилання на зображення монети.

public void setImage(BufferedImage img) – встановлює зображення, посилання на яке отримується у якості аргументу.

public int getSizeY() – повертає розмір картинки вздовж осі У.

public int getSizeX() – повертає розмір картинки вздовж осі Х.

class TCScores – клас, який організовує роботу з усією статистикою у грі, в тому числі завантаження та збереження статистики з файлу, реалізовано усі методи необхідні для роботи зі статистикою.

· protected int scores – містить у собі очки гравця.

· protected int allscores – містить усі очки які були набрані впродовж усього часу.

· protected int coins – зберігається кількість монет набраних гравцем.

· protected int top10[] – містить дані про 10 кращих результатів у грі

· protected int jumps – кількість стрибків зроблена гравцем.

· protected int alljumps – усі стрибки коли-небудь зроблені гравцем.

· protected int allcoins – усі монети яки зібрав гравець.

· protected int lastjumps – остання кількість стрибків які зробив гравець.

· protected int lastcoins – кількість монет набрана за минулу гру.

· protected int lastscores – кількість очок набрана під час минулої гри.

· protected int jet – кількість придбаних гелікоптерів.

· protected int rock – кількість придбаних ракет.

· protected int maxgamecoins – максимально набрана сума монет на протязі однієї гри.

· protected int allgames – кількість ігор, які зіграв користувач за весь час.

· protected int potrach – кількість монет які витратив гравець за весь час.

· File load – містить посилання на файл зі статистикою.

· Scanner TLoad – містить посилання на об’єкт класу Scanner, який використовується для завантаження інформації з файлу.

· FileWriter TTS – містить посилання на об’єкт класу FileWriter, який використовується для збереження усієї інформації у файл.

public void addTop(int score) – метод, який отримує у якості аргументу кількість набраних очок, та у разі нового рекорду розміщує данні про це у відповідному місце рейтингової таблиці.

public void saveStatistic(int score, int jumps, int coin, int jet1, int rock1, int por) – метод який записує до файлу усі данні, які збираються, у якості аргументів передаються усі необхідні для збереження данні.

public void displayStatistic(Graphics g) – виводить на екран усі статистичні данні які містяться у файлі.

class TConsole – клас, який відображає ігрову консоль, за допомогою якої можна керувати ігровим процесом.

protected int f1…f7 – змінні які містять значення 1, якщо команду увімкнено.

Boolean cheat – містить значення true, якщо було використано якусь з заборонених команд(чит-команд).

public void DisplayConsole(Graphics g) – метод, який відображає ігрову консоль на екрані.

public void ClearCheats() – видаляє усі сліди використання читів, викликається при старті нової гри.

public Boolean isF1()…isF7() – повертає true, якщо даний чит увімкнено.

public void setCheat(int number) – встановлює вибраний чит активним, та у подальшому забороняє зберігати статистику у цій грі.

class TBlock – клас, який реалізує статичні блоки та усі необхідні функції для роботи з ним, при цьому реалізовує інтерфейс IBlock.

· protected int objtype – містить інформацію про тип платформи.

· protected int pos_x – містить положення платформи по осі Х.

Написати коментар:

Ваша пошт@ не публікуватиметься. Обов’язкові поля позначені *