Розробка гри "Jump way"

Розробка програмного додатку - гри "Jump way", яка поєднала в собі сучасні методи побудови 2D ігор. Обґрунтування вибору мови програмування. Проектування UML-діаграм класів. Користувацький інтерфейс. Програмна реалізація гри. Інструкція користувача.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 09.01.2017
Размер файла 1,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ЗМІСТ

  • ВСТУП
  • 1. АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ
    • 1.1 Предметна область
    • 1.2 Огляд існуючих аналогів
    • 1.3 Обґрунтування вибору мови програмування
    • 1.4 Розробка технічного завдання на роботу
    • 1.5 Висновки
  • 2. ПРОЕКТУВАННЯ МЕТОДІВ ТА ЗАСОБІВ ГРИ «JUMP WAY»
  • 2.1 Проектування UML-діаграм класів
    • 2.2 Проектування UML - діаграм послідовностей
    • 2.3 Проектування блок - схеми алгоритму програми
    • 2.4 Проектування користувацького інтерфейсу
    • 2.5 Висновки
  • 3. ПРОГРАМНА РЕАЛІЗАЦІЯ ГРИ «JUMP WAY»
    • 3.1 Процес розробки користувацького інтерфейсу
    • 3.2 Програмна реалізація гри
    • 3.3 Інструкція користувача
    • 3.4 Висновки
  • ВИСНОВКИ
  • ПЕРЕЛІК ПОСИЛАНЬ
  • ДОДАТКИ

ВСТУП

В даній курсовій роботі буде розроблено та створено «Jump way».

Актуальність даної розробки полягає в створенні нового покращеного варіанту гри, в якому враховуються недоліки аналогів. Гра має яскравий інтерфейс і зрозумілий геймплей, тому цікава для гравців різних вікових категорій.

Програмний додаток розроблений також в навчальних цілях, оскільки для його створення було опрацьовано теоретичний матеріал, створено UML - діаграми класів та блок - схему алгоритму, а також гру було реалізовано програмно, що дало змогу покращити навички програмування в середовищі для створення ігор Unity3D.

Гра «Jump way» поєднала в собі сучасні методи побудови 2D ігор.

1. АНАЛІЗ ПРЕДМЕТНОЇ ОБЛАСТІ

В даному розділі буде розглянута предметна область гри «Jump way», коротко описані правила гри, розглянуті переваги і недоліки гри, обґрунтовано мову і засіб програмування, а також сформульоване технічне завдання для написання гри.

1.1 Предметна область

«Jump way» проста і весела гра, розрахована на одного гравця. У користувача є один куб, який потрібно спустити якомога нижче. Для того щоб його спустити донизу, потрібно пригати по платформах. Переміщення відбувається за допомогою кліку по кубові. В грі представлений простий, але привабливий інтерфейс.

Гра розпочинається кліком мишки у певну область.

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

Також у даній грі присутній лічильник успіхів гравця, тобто його очки.

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

Гра має велику популярність серед інтернет користувачів тому її реалізація є доречною.

1.2 Існуючі реалізації гри

Оскільки, гра «Jump way» була створена для телефонів в 2D графіці то для комп'ютерів такої самої реалізації немає тому буде розглянуто приклади з подібними іграми до «Jump way».

Одним з представників таких видів ігор є гра «Doodle Jump» (рис 1.1).

Рисунок 1.1 - Вигляд вікна гри «Doodle Jump»

Дана гра знаходиться на сайті https://play.google.com. Ця гра не потребує реєстрації на сайті в неї не погана графіка що дозволяє її бути популярною серед користувачів. Але основними мінусами даної гри ї те що в неї немає мережевої реалізації, немає списку рекордів що є поганим для сучасних ігор.

Іншим аналогом є гра «Jelly Jump» яка знаходиться на сайті https://play.google.com (рис 1.2).

Размещено на http://www.allbest.ru/

Рисунок 1.2 - Вигляд вікна гри «Jelly Jump»

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

Ще одним представником є гра «Beat Stomper» (рис 1.3).

Рисунок 1.3 - Вигляд вікна гри «Beat Jump»

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

Однією з популярних на сайтах гра є «Happy jump» яка знаходиться на сайті https://play.google.com/store (рис. 1.4).

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

Рисунок 1.4 - Вигляд вікна гри «Happy Jump»

Ще одним представником аркад є гра «Go Up» з сайту https://play.google.com/store/apps/details?id=com.ketchapp.up (рис.1.5).

Рисунок 1.5 - Вигляд вікна гри «Go Up»

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

1.3 Обґрунтування вибору мови програмування

програмування гра інтерфейс користувач

Для написання гри «Jump way» було обрано мову C#, оскільки наявні практичні навички в розробці додатків цією мовою програмування. C# - об'єктно-орієнтована мова високого рівня. Перевагою цієї мови програмування для створення гри є те, що вона об'єднує переваги інших поширених мов програмування і має ряд власних особливостей:

- підтримка інкапсуляції, наслідування і поліморфізму;

- підтримка компонентів;

- використання «збору сміття»;

– чітка типізація змінних;

– автоматична ініціалізація змінних;

- використання обробки виключень;

- можливість перевантаження операторів.

В якості середовища програмування було обрано Unity. Unity3D -- популярне середовище для створення ігор, що має безліч потужних і зручних інструментів.

Першою перевагою є можливість писати скрипти на мові C#, оскільки саме ця мова програмування була обрана для написання гри. Серед інших основних переваг Unity3D можна відзначити наступні:

- зрозумілий і доступний інтерфейс;

- можливість створення 2D ігор;

- вбудована підтримка мережі;

- підтримка імпорту великої кількості форматів;

- можливість тестування гри безпосередньо в редакторі.

Unity 5.4 отримав нову і вдосконалену мультиплеєрну систему з більш гнучкою і потужною системою, ніж ті, що були впроваджені в більш ранніх версіях Unity.

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

Отже, C# і Unity 3D - найкращий вбір для написання гри «Jump way», оскільки ця мова програмування має перелік переваг, яких немає у інших високорівневих мовах програмування, які є попередниками мови C#.

1.4 Постановка задачі

Завданням проекту є написання гри яка має назву «Jump way».

Гра буде створена на платформі Unity 5 з використанням мови програмування C# для покращення навиків програмування і вивчення методів розробки комп'ютерної гри. Розробити інтерфейс гри за допомогою платформи Unity 5. Управління здійснюватиметься за допомогою комп'ютерної мишки.

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

При невдачі в проходженні гри вивести відповідний текст з можливістю почати спочатку.

«Jump way» - це аркадна гра (Arcade game) - дії якої відбуваються у вигаданому автором світі.

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

Для зручності проходження гри поставленні наступні задачі:

- зупинка гри, з виходом в головне меню в будь-який момент гри;

- створення платформ ;

- зміна зовнішнього вигляду головного персонажу гри - куба;

- додати музичний супровід;

- створити можливість виключення музики і звуків.

Для запуску програми апаратне забезпечення повинно відповідати мінімальним вимогам:

- комп'ютер серії IBM PC з частотою 233 МГц і вище;

- 64МБ оперативної пам'яті;

- графічний адаптер SVGA (Super Video Graphic Adapter);

- відеокарта об'ємом пам'яті не менше 4МБ;

- клавіатура;

- ОС Windows Vista/7/ХР;

Розмір дискового простору, що займає програма: 15 704 байт. Розмір оперативної пам'яті, що займає програма: 3 500 КБайт.

1.5 Висновки

Предметна область розробки - гра «Jump way». Дана гра розрахована для одного гравця. Головна ціль - перемістити куб на платформу яка з'являтиметься нижче тієї на якій знаходиться куб.

Отже, основне завдання - розробити власну з урахуванням плюсів і мінусів аналогів з простим, зрозумілим інтерфейсом.

В якості мови програмування було обрано об'єктно-орієнтовану мову високого рівня C#, а середовища програмування - інструмент для створення ігор Unity 3D, оскільки їх особливості добре підходять для розробки обраної гри.

2. ПРОЕКТУВАННЯ МЕТОДІВ ТА ЗАСОБІВ ГРИ «JUMP WAY»

В даному розділі створено UML-діаграми класів, UML-діаграму послідовностей класів, та користувацький інтерфейс.

2.1 Проектування UML-діаграм класів

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

У UML атрибути показуються щонайменше назвою, також може бути показано їх тип, початкове значення і інші властивості. Крім того, атрибути може бути показано з областю видимості атрибута: «+» (public), «#» (protected) та «-» (private).

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

Для того, щоб перейти до програмної реалізації гри, необхідно створити UML діаграми класів.

Розглянемо UML-діаграму класу DetectClicks (Рис.2.1). З даної діаграми видно що область видимості майже усіх атрибутів «+», тобто public, лише один атрибут має видимість «-».

Клас має велику кількість методів, метод Update () відповідає за включення всіх компонентів: взаємодія з об'єктами, камера, освітлення. Методи delCubes () i CubeToBlock () відповідають за переміщення та видалення використаних кубів.

Рисунок 2.1 - Діаграма класу DetectClicks

Далі наведемо діаграму класу CubeJump (Рис.2.2). В даній діаграмі описано головну дій гри, а саме прижок куба з однієї платформи на іншу. Видимість більшості атрибутів «-», тобто private. Всі методи даного класу також private.

Методи PressCube(), OnMouseUp(), OnMouseDown() відповідають за властивоті куба при клікові по ньому та набуття наступних дій, скорість його руху. Метод PlayerLose() відповідає за перевірку програшу, тобто перевірку позиції кубу у просторі.

Рисунок 2.2 - Вигляд діаграми класу CubeJump

Далі покажемо наступний клас SpawnBlocks (Рис 2.3). В цій діаграмі показано що клас SpawnBlocks має більшість private, лише декілька public значень. Метод SpawnBlock () відповідає за своєчасне створення нових платформ для подальших дій. Метод RandScale () задає різні розміри створених платформ, для ускладнення гри.

Рисунок 2.3 - Вигляд діаграми класу SpawnBlock

Наступним буде розглянуто діаграма класу Score (Рис2.4).

Рисунок 2.4 - Вигляд діаграми класу Score.

Дана діаграма показує, що клас Score має дві змінні private, та одну public.

Даний клас відповідає за лічильник набраних балів.

2.2 Проектування UML - діаграм послідовностей

Діаграма послідовностей відноситься до діаграм взаємодії UML, що описує поведінкові аспекти системи, але відображає часові особливості передачі і прийому повідомлень об'єктами.

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

2.3 Проектування блок - схеми алгоритму програми

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

Існують правила зображення блок-схем алгоритмів. Кожен алгоритм має початок та кінець. Кожна команда алгоритму представляється у вигляді геометричних фігур, які мають певну конфігурацію, в залежності від характеру дій, що будуть виконуватись. Геометричні фігури з'єднуються між собою лініями або стрілками, які вказують порядок виконання дій

Рисунок 2.6 - Блок-схема алгоритму визначення переможця

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

2.4 Проектування користувацького інтерфейсу

Для реалізації гри в Unity необхідно створити головну сцену.

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

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

Наступним кроком став імпорт зображень, які будуть фоном та героями. Для того, щоб імпортувати зображення потрібно додати його до папки Assets, яка знаходиться у розділі Project, а потім просто перетягнути на місце на сцені, де воно має розташовуватись. У разі, якщо необхідно розташувати зображення одне за одним чи повернути їх, необхідно змінити налаштування у розділі Transform вкладки Inspector. Щоб об'єкти могли взаємодіяти і рухатись, до них необхідно додати Collider та Rigidbody2D, які знаходяться у розділі «Add Component => Physics2D». Після цього можна переходити до програмної частини.

Для створення головного меню можна використати UI (User Interface) System. Дана система дозволяє створювати яскраве меню, яке створюється не на основі коду, а за допомогою інструментів візуальної розробки.

Для початку потрібно полотно, на якому будуть розміщені елементи. Для цього переходимо в меню "GameObject => UI => Canvas". Далі необхідно працювати з Canvas. У вкладці інспектор в розділі Render Mode обираємо параметр Screen Space - Overlay. У даному режимі полотно масштабується за розмірами екрану і відображається без зв'язку зі сценою або камерою. У разі зміни розміру вікна, полотно буде розтягнуто під розміри екрана. Полотно буде малюватися поверх всіх інших графічних елементів.

2.5 Висновки

В даному розділі було спроектовано UML - діаграми класів та їх залежностей. В даних діаграмах зображуються класи (до яких входять методи та атрибути) та їх зв'язок. UML-діаграми класів застосовуються при прямому та зворотному проектуванні. Також було спроектовано UML-діаграму послідовностей класів, та блок-схему алгоритму здійснення ходу.

Блок - схеми та UML-діаграми послідовностей допомагають відобразити послідовність дій у програмі. В розділі також розроблено користувацький інтерфейс програми.

3. ПРОГРАМНА РЕАЛІЗАЦІЯ ГРИ «JUMP WAY»

На основі спроектованих методів та засобів гри «Jump way» розробимо програмну реалізацію гри, опишемо створений інтерфейс користувача та інструкцію роботи з програмою.

3.1 Процес розробки користувацького інтерфейсу

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

Наступним кроком став імпорт зображень, які будуть фоном та героями. Для того, щоб імпортувати зображення потрібно додати його до папки Assets, яка знаходиться у розділі Project, а потім просто перетягнути на місце на сцені, де воно має розташовуватись. У разі, якщо необхідно розташувати зображення одне за одним чи повернути їх, необхідно змінити налаштування у розділі Transform вкладки Inspector. Щоб об'єкти могли взаємодіяти і рухатись, до них необхідно додати Collider та Rigidbody2D, які знаходяться у розділі «Add Component => Physics2D». Після цього можна переходити до програмної частини.

Для створення головного меню можна використати UI (User Interface) System. Дана система дозволяє створювати яскраве меню, яке створюється не на основі коду, а за допомогою інструментів візуальної розробки.

Для початку потрібно накинути сценарій на камеру:

private void Awake()

{

m_Camera = GetComponentInChildren<Camera>();

}

private void FixedUpdate()

{

Move();

Zoom();

}

Даний клас ініціалізує камеру.

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

Створення програми починається із розробки інтерфейсу. Після цього за об'єктами закріпляються сценарій, в яких описується логіка гри.

Гравець повинен натиснути в певну область поля гри.

private bool clicked;

void Update ()

{

if (clicked && dirLight.intensity != 0)

dirLight.intensity -= 0.03f;

if (clicked && dirLight_2.intensity >= 1.05f)

dirLight.intensity -= 0.025f;

}

void OnMouseDown ()

{

clicked = true; // Works only ones

playTxt.gameObject.SetActive (false);

record.gameObject.SetActive (true);

gameName.text = "0";

buttons.GetComponent <Scrollobjectg> ().speed = -10f;

buttons.GetComponent <Scrollobjectg> ().checkPos = -130f;

m_cube.GetComponent <Animation> ().Play ("StartGameCube");

StartCoroutine (CubeToBlock ());

m_cube.transform.localScale = new Vector3 (1f, 1f, 1f);

cubes_anim.Play ();

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

public GameObject block, allCubes;

private GameObject blockInst;

private Vector3 blockPos;

private float speed = 7f;

private bool onPlace;

void Start ()

{

spawn ();

}

void Update ()

{

if (blockInst.transform.position != blockPos && !onPlace)

blockInst.transform.position = Vector3.MoveTowards (blockInst.transform.position, blockPos, Time.deltaTime * speed);

else if (blockInst.transform.position == blockPos)

onPlace = true;

if (CubeJump.jump && CubeJump.nextBlock)

{

spawn ();

onPlace = false;

}

}

float RandScale () {

float rand;

if (Random.Range (0, 100) > 80)

rand = Random.Range (1.2f, 2f);

else

rand = Random.Range (1.2f, 1.5f);

return rand;

}

void spawn ()

{

blockPos = new Vector3 (Random.Range (0.7f, 1.7f), -Random.Range (0.6f, 3.2f), -5.8f);

blockInst = Instantiate (block, new Vector3 (9f, -5f, -5.8f), Quaternion.identity) as GameObject;

blockInst.transform.localScale = new Vector3 (RandScale (), blockInst.transform.localScale.y, blockInst.transform.localScale.z);

blockInst.transform.parent = allCubes.transform;

}

}

void OnTriggerEnter (Collider other)

{

if (other.tag == "Cube")

Destroy (other.gameObject);

}

}

if (!lose) {

nextBlock = true;

count_blocks++;

print ("Next One");

}

}

}

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

void Start ()

{

StartCoroutine (CanJump ());

}

void FixedUpdate ()

{

if (animate && mainCube.transform.localScale.y > 0.4f)

PressCube (-scratch_speed);

else if (!animate && mainCube != null)

{

if (mainCube.transform.localScale.y < 1f)

PressCube (scratch_speed * 3f);

else if (mainCube.transform.localScale.y != 1f)

mainCube.transform.localScale = new Vector3 (1f, 1f, 1f);

}

if (mainCube != null)

{

if (mainCube.transform.position.y < -7.5f)

{

Destroy (mainCube, 0.5f);

print ("Player Lose");

lose = true;

}

}

if (lose)

PlayerLose ();

}

void PlayerLose ()

{

buttons.GetComponent <Scrollobjectg> ().speed = 5f;

buttons.GetComponent <Scrollobjectg> ().checkPos = 0;

if (!lose_buttons.activeSelf)

lose_buttons.SetActive (true);

lose_buttons.GetComponent <Scrollobjectg> ().checkPos = 70;

}

void OnMouseDown () {

if (nextBlock && mainCube.GetComponent <Rigidbody> ())

{

animate = true;

startTime = Time.time;

yPosCube = mainCube.transform.localPosition.y;

}

}

void OnMouseUp () {

if (nextBlock && mainCube.GetComponent <Rigidbody> ())

{

animate = false;

//Jump

jump = true;

float force, diff;

diff = Time.time - startTime;

if (diff < 3f)

force = 190 * diff;

else

force = 280f;

if (force < 60)

force = 60;

mainCube.GetComponent <Rigidbody> ().AddRelativeForce (mainCube.transform.up * force);

mainCube.GetComponent <Rigidbody> ().AddRelativeForce (mainCube.transform.right * -force);

StartCoroutine (checkCubePos ());

nextBlock = false;

}

}

void PressCube (float force )

{

mainCube.transform.localPosition += new Vector3 (0f, force * Time.deltaTime, 0f);

mainCube.transform.localScale += new Vector3 (0f, force * Time.deltaTime, 0f);

}

IEnumerator checkCubePos ()

{

yield return new WaitForSeconds (1.5f);

if (yPosCube == mainCube.transform.localPosition.y)

{

print ("Player Lose ");

lose = true;

}

else {

while (!mainCube.GetComponent <Rigidbody> ().IsSleeping ())

{

yield return new WaitForSeconds (0.05f);

if (mainCube == null)

break;

}

if (!lose) {

nextBlock = true;

count_blocks++;

print ("Next One");

mainCube.transform.localPosition = new Vector3 (1.8f, mainCube.transform.localPosition.y, mainCube.transform.localPosition.z);

mainCube.transform.eulerAngles = new Vector3 (0f, mainCube.transform.eulerAngles.y, 0f);

}

}

IEnumerator CanJump () {

while (!mainCube.GetComponent <Rigidbody> ())

yield return new WaitForSeconds (0.05f);

yield return new WaitForSeconds (1f);

nextBlock = true;

}

}

}

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

IEnumerator checkCubePos ()

{

yield return new WaitForSeconds (1.5f);

if (yPosCube == mainCube.transform.localPosition.y)

{

print ("Player Lose ");

lose = true;

void Start ()

{

Destroy (gameObject, 1f);

}

// Update is called once per frame

void Update ()

{

transform.position += new Vector3 (0, 0.2f, 0);

}

}

public float speed = 5f, checkPos = 0f;

private RectTransform rec;

void Start()

{

rec = GetComponent <RectTransform> ();

}

void Update()

{

if (rec.offsetMin.y != checkPos)

{

rec.offsetMin += new Vector2 (rec.offsetMin.x, speed);

rec.offsetMax += new Vector2 (rec.offsetMax.x, speed);

}

}

}

void OnMouseUpAsButton () {

switch (gameObject.name) {

case "Restart":

SceneManager.LoadScene ("main");

break;

}

}

}

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

public Text record;

private Text txt;

private bool gameStart;

void Start ()

{

record.text = "TOP: " + PlayerPrefs.GetInt ("Record").ToString ();

txt = GetComponent <Text> ();

CubeJump.count_blocks = 0;

}

void Update ()

{

if (txt.text == "0")

gameStart = true;

if (gameStart)

{

txt.text = CubeJump.count_blocks.ToString ();

if (PlayerPrefs.GetInt ("Record") < CubeJump.count_blocks)

{

PlayerPrefs.SetInt ("Record", CubeJump.count_blocks);

record.text = "TOP: " + PlayerPrefs.GetInt ("Record").ToString ();

}

}

}

}

3.3 Інструкція користувача

Для запуску гри необхідно відкрити виконуваний файл програми «Jump way». Після цього користувач побачить вікно, на якому пропонується обрати дозвіл екрану та якість графіки.

Рисунок 3.1 - Вигляд вікна налаштувань програми

Якщо натиснути на кнопку «Quit», програма завершить свою роботу.

Рисунок 3.2 - Вигляд головного меню програми

Рисунок 3.3 - Вигляд ігрової сцени програми

На сцені є лічильник успіхів гравця.

Рисунок 3.4 - Вигляд меню програшу

3.4 Висновки

В даному розділі було описано практичну реалізацію гри «Jump Way». Гра створена на об'єктно-орієнтованій мові програмування високого рівня С#, а в якості середовища програмування було обрано потужний інструмент для створення ігор Unity3D.

За допомогою інструментів Unity3D було розроблено яскравий інтерфейс та зручне меню. В даному розділі також було описано програмну реалізацію основних можливостей.

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

ВИСНОВКИ

Завданням даної курсової роботи є розробка гри «Jump Way».

Для того, щоб правильно реалізувати гру, було розглянуто правила гри. Щоб уникнути незручностей, які можуть виникнути для гравця, було проаналізовано аналоги гри, їх основні переваги та найпоширеніші недоліки.

Для полегшення програмної реалізації гри було спроектовано UML - діаграми класів та залежностей, а також для того, щоб краще розуміти послідовність дій в класах, було розроблено UML - діаграму послідовностей, спроектовано блок - схему алгоритму здійснення ходу.

Також було програмно реалізовано гру, створено користувацький інтерфейс. В якості мови програмування було обрано об'єктно - орієнтовану мову високого рівня C#, а середовищем програмування було обрано Unity3D, оскільки воно має багато інструментів, за допомогою яких простіше створити обрану гру.

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

ПЕРЕЛІК ПОСИЛАНЬ

1. https://play.google.com/store/apps/details?id=com.lima.doodlejump&hl=ru

2. https://play.google.com/store/apps/details?id=com.ketchapp.jellyjump&hl=ru.html

3. https://play.google.com/store/apps/details?id=com.noodlecake.happyjump&hl=ru

4. https://play.google.com/store/apps/details?id=com.ketchapp.up

5. Шилдт, Г.C# 3.0: руководство для начинающих [Текст]: учебное пособие/ Ш. Герберт. - 2-е изд. - М.: ООО "И.Д. Вильямс", 2009. - 688 с.

6. Елементи UML [Електронний ресурс] / Режим доступу: https://docs.kde.org/ trunk4/uk/kdesdk/umbrello/uml-elements.html#sequence-diagram

7. Грейди Буч, Джеймс Рамбо, Айвар Джекобсон. Язык UML. Руководство пользователя = The Unified Modeling Language user guide. -- 2-е изд. -- М., СПб.: ДМК Пресс, Питер, 2004. -- 432 с.

8. Блок-схема [Електронний ресурс] / Режим доступу: https://uk. wikipedia.org/ wiki/Блок-схема.

9. Э. Стиллмен, Д. Грин. Изучаем C#. Санкт - Петербург, 2012.

10. Михаил Фленов Библия C#/ Михаил Фленов - БХВ-Петербург, 2011.

11. Бадд Т. Объектно-ориентированное программирование в действии: Пер. с англ./Тимоти Бадд. - СПб.: Питер, 2003.

12. Страуструп Б. Язык программирования C++ / Страуструп Б. - Бином, 2011.

ДОДАТКИ

Додаток А(обов'язковий)

Лістинг програми

CubeJump

using UnityEngine;

using System.Collections;

public class CubeJump: MonoBehaviour {

public static bool jump, nextBlock;

public GameObject mainCube, buttons, lose_buttons;

private bool animate, lose;

private float scratch_speed = 0.5f, startTime, yPosCube;

public static int count_blocks;

void Start () {

StartCoroutine (CanJump ());

}

void FixedUpdate () {

if (animate && mainCube.transform.localScale.y > 0.4f)

PressCube (-scratch_speed);

else if (!animate && mainCube != null) {

if (mainCube.transform.localScale.y < 1f)

PressCube (scratch_speed * 3f);

else if (mainCube.transform.localScale.y != 1f)

mainCube.transform.localScale = new Vector3 (1f, 1f, 1f);

}

if (mainCube != null) {

if (mainCube.transform.position.y < -7.5f) {

Destroy (mainCube, 0.5f);

print ("Player Lose");

lose = true;

}

}

if (lose)

PlayerLose ();

}

void PlayerLose () {

buttons.GetComponent <Scrollobjectg> ().speed = 5f;

buttons.GetComponent <Scrollobjectg> ().checkPos = 0;

if (!lose_buttons.activeSelf)

lose_buttons.SetActive (true);

lose_buttons.GetComponent <Scrollobjectg> ().checkPos = 70;

}

void OnMouseDown () {

if (nextBlock && mainCube.GetComponent <Rigidbody> ()) {

animate = true;

startTime = Time.time;

yPosCube = mainCube.transform.localPosition.y;

}

}

void OnMouseUp () {

if (nextBlock && mainCube.GetComponent <Rigidbody> ()) {

animate = false;

//Jump

jump = true;

float force, diff;

diff = Time.time - startTime;

if (diff < 3f)

force = 190 * diff;

else

force = 280f;

if (force < 60)

force = 60;

mainCube.GetComponent <Rigidbody> ().AddRelativeForce (mainCube.transform.up * force);

mainCube.GetComponent <Rigidbody> ().AddRelativeForce (mainCube.transform.right * -force);

StartCoroutine (checkCubePos ());

nextBlock = false;

}

}

void PressCube (float force ) {

mainCube.transform.localPosition += new Vector3 (0f, force * Time.deltaTime, 0f);

mainCube.transform.localScale += new Vector3 (0f, force * Time.deltaTime, 0f);

}

IEnumerator checkCubePos () {

yield return new WaitForSeconds (1.5f);

if (yPosCube == mainCube.transform.localPosition.y) {

print ("Player Lose ");

lose = true;

}

else {

while (!mainCube.GetComponent <Rigidbody> ().IsSleeping ()) {

yield return new WaitForSeconds (0.05f);

if (mainCube == null)

break;

}

if (!lose) {

nextBlock = true;

count_blocks++;

print ("Next One");

mainCube.transform.localPosition = new Vector3 (1.8f, mainCube.transform.localPosition.y, mainCube.transform.localPosition.z);

mainCube.transform.eulerAngles = new Vector3 (0f, mainCube.transform.eulerAngles.y, 0f);

}

}

}

IEnumerator CanJump () {

while (!mainCube.GetComponent <Rigidbody> ())

yield return new WaitForSeconds (0.05f);

yield return new WaitForSeconds (1f);

nextBlock = true;

}

}

DetectClicks

using UnityEngine;

using UnityEngine.UI;

using System.Collections;

public class Detectclicks: MonoBehaviour {

public GameObject [] cubes;

public GameObject buttons, m_cube, spawn_blocks;

public Text playTxt, gameName, record;

public Animation cubes_anim, block;

public Light dirLight, dirLight_2;

private bool clicked;

void Update () {

if (clicked && dirLight.intensity != 0)

dirLight.intensity -= 0.03f;

if (clicked && dirLight_2.intensity >= 1.05f)

dirLight.intensity -= 0.025f;

}

void OnMouseDown ()

{

if (!clicked) {

StartCoroutine (Delcubes ());

clicked = true; // Works only ones

playTxt.gameObject.SetActive (false);

record.gameObject.SetActive (true);

gameName.text = "0";

buttons.GetComponent <Scrollobjectg> ().speed = -10f;

buttons.GetComponent <Scrollobjectg> ().checkPos = -130f;

m_cube.GetComponent <Animation> ().Play ("StartGameCube");

StartCoroutine (CubeToBlock ());

m_cube.transform.localScale = new Vector3 (1f, 1f, 1f);

cubes_anim.Play ();

}

}

IEnumerator Delcubes () {

for (int i = 0; i < 3; i++) {

yield return new WaitForSeconds (0.3f);

cubes [i].GetComponent <FallCube> ().enabled = true;

}

spawn_blocks.GetComponent <SpawnBlocks> ().enabled = true;

}

IEnumerator CubeToBlock () {

yield return new WaitForSeconds (m_cube.GetComponent <Animation> ().clip.length + 0.5f);

block.Play ();

//add rigid component

m_cube.AddComponent <Rigidbody> ();

}

}

Score

using UnityEngine;

using UnityEngine.UI;

using System.Collections;

public class Score: MonoBehaviour {

public Text record;

private Text txt;

private bool gameStart;

void Start () {

record.text = "TOP: " + PlayerPrefs.GetInt ("Record").ToString ();

txt = GetComponent <Text> ();

CubeJump.count_blocks = 0;

}

void Update () {

if (txt.text == "0")

gameStart = true;

if (gameStart) {

txt.text = CubeJump.count_blocks.ToString ();

if (PlayerPrefs.GetInt ("Record") < CubeJump.count_blocks) {

PlayerPrefs.SetInt ("Record", CubeJump.count_blocks);

record.text = "TOP: " + PlayerPrefs.GetInt ("Record").ToString ();

}

}

}

}

SpawnBlock

using UnityEngine;

using System.Collections;

public class SpawnBlocks: MonoBehaviour {

public GameObject block, allCubes;

private GameObject blockInst;

private Vector3 blockPos;

private float speed = 7f;

private bool onPlace;

void Start () {

spawn ();

}

void Update () {

if (blockInst.transform.position != blockPos && !onPlace)

blockInst.transform.position = Vector3.MoveTowards (blockInst.transform.position, blockPos, Time.deltaTime * speed);

else if (blockInst.transform.position == blockPos)

onPlace = true;

if (CubeJump.jump && CubeJump.nextBlock) {

spawn ();

onPlace = false;

}

}

float RandScale () {

float rand;

if (Random.Range (0, 100) > 80)

rand = Random.Range (1.2f, 2f);

else

rand = Random.Range (1.2f, 1.5f);

return rand;

}

void spawn () {

blockPos = new Vector3 (Random.Range (0.7f, 1.7f), -Random.Range (0.6f, 3.2f), -5.8f);

blockInst = Instantiate (block, new Vector3 (9f, -5f, -5.8f), Quaternion.identity) as GameObject;

blockInst.transform.localScale = new Vector3 (RandScale (), blockInst.transform.localScale.y, blockInst.transform.localScale.z);

blockInst.transform.parent = allCubes.transform;

}

}

MovesCube

using UnityEngine;

using System.Collections;

public class MovesCube: MonoBehaviour {

private bool moved = true;

private Vector3 target;

void Start () {

target = new Vector3 (-4.66f, 4.02f, 0.16f);

}

void Update () {

if (CubeJump.nextBlock) {

if (transform.position != target)

transform.position = Vector3.MoveTowards (transform.position, target, Time.deltaTime * 5f);

else if (transform.position == target && !moved) {

target = new Vector3 (transform.position.x - 5f, transform.position.y + 5f, transform.position.z);

CubeJump.jump = false;

moved = true;

}

if (CubeJump.jump)

moved = false;

}

}

}

DeleteBlocks

using UnityEngine;

using System.Collections;

public class DeleteBlocks: MonoBehaviour {

void OnTriggerEnter (Collider other) {

if (other.tag == "Cube")

Destroy (other.gameObject);

}

}

Buttons

using UnityEngine;

using UnityEngine.SceneManagement;

using System.Collections;

public class BUTTONS: MonoBehaviour

{

void OnMouseDown()

{

transform.localScale = new Vector3(1.1f, 1.1f, 1.1f);

}

void OnMouseUp()

{

transform.localScale = new Vector3 (1f, 1f, 1f);

}

void OnMouseUpAsButton () {

switch (gameObject.name) {

case "Restart":

SceneManager.LoadScene ("main");

break;

case "FaceBook":

Application.OpenURL ("https://facebook.com");

break;

}

}

}

FallCube

using UnityEngine;

using System.Collections;

public class FallCube: MonoBehaviour {

void Start () {

Destroy (gameObject, 1f);

}

void Update () {

transform.position += new Vector3 (0, 0.2f, 0);

}

}

ScrollObject

using UnityEngine;

using System.Collections;

public class Scrollobjectg: MonoBehaviour {

public float speed = 5f, checkPos = 0f;

private RectTransform rec;

void Start()

{

rec = GetComponent <RectTransform> ();

}

void Update() {

if (rec.offsetMin.y != checkPos) {

rec.offsetMin += new Vector2 (rec.offsetMin.x, speed);

rec.offsetMax += new Vector2 (rec.offsetMax.x, speed);

}

}

}

SpawnStar

using UnityEngine;

using System.Collections;

public class SpawnStar: MonoBehaviour {

public GameObject star;

void Start () {

StartCoroutine (spawn ());

}

IEnumerator spawn () {

while (true) {

Vector3 pos = Camera.main.ScreenToWorldPoint (new Vector3 (Random.Range (0, Screen.width), Random.Range (0, Screen.height), Camera.main.farClipPlane / 2));

Instantiate (star, pos, Quaternion.identity);

yield return new WaitForSeconds (5.01f);

}

}

}

StarAnimation

using UnityEngine;

using System.Collections;

public class StarAnimation: MonoBehaviour {

private SpriteRenderer star;

void Start () {

star = GetComponent <SpriteRenderer> ();

Destroy (gameObject, 5f);

}

void Update () {

star.color = new Color (star.color.r, star.color.g, star.color.b, Mathf.PingPong (Time.time / 2.5f, 1.0f));

}

}

TextFade

using UnityEngine;

using UnityEngine.UI;

using System.Collections;

public class textFade: MonoBehaviour {

private Text txt;

private Outline oLine;

void Start () {

txt = GetComponent<Text> ();

oLine = GetComponent<Outline> ();

}

void Update () {

txt.color = new Color (txt.color.r, txt.color.g, txt.color.b, Mathf.PingPong (Time.time / 2.5f, 1.0f));

oLine.effectColor = new Color (oLine.effectColor.r, oLine.effectColor.g, oLine.effectColor.b, txt.color.a - 0.3f);

}

}

Размещено на Allbest.ru


Подобные документы

  • Призначення менеджеру пристроїв. Обґрунтування вибору мови програмування. Розробка структурної схеми і опис діалогового інтерфейсу програми. Блок-схема програмного додатку, основні функції і алгоритм його роботи. Методики і інструкція його тестування.

    курсовая работа [3,4 M], добавлен 17.11.2014

  • Дослідження класифікації автоматизованих інформаційних систем. Обґрунтування вибору мови і системи програмування. Програмне забезпечення та опис компонентів середовища. Інтерфейс програмного комплексу. Розрахунок повної собівартості програмного продукту.

    дипломная работа [584,1 K], добавлен 26.06.2015

  • Особливості системи онлайн-агрегаторів новин, універсальної програмної платформи Microsoft Window. Використання мови програмування C#, створення бази даних. Розробка програмного продукту, алгоритм його створення. Вихідний код та інструкція користувача.

    дипломная работа [730,9 K], добавлен 21.01.2016

  • Розробка програми для моделювання роботи алгоритму Дейкстри мовою C# з використанням об’єктно-орієнтованих принципів програмування. Алгоритм побудови робочого поля. Програмування графічного інтерфейсу користувача. Тестування програмного забезпечення.

    курсовая работа [991,4 K], добавлен 06.08.2013

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

    дипломная работа [2,4 M], добавлен 16.07.2014

  • Реєстр ОС Windows 7 та оцінка його ролі, структура та елементи. Структура та функціональні особливості Windows-додатку. Розробка програмного додатку зчитування даних з реєстру: вибір середовища програмування та алгоритм, а також інструкція користувача.

    курсовая работа [228,3 K], добавлен 29.05.2015

  • Формування валютних операцій. Організація проведення контролю та аналізу валютних операцій. Характеристика автоматизованих систем валютних операцій. Обґрунтування вибору середовища розробки. Розробка програмного модуля. Реалізація інтерфейсу користувача.

    курсовая работа [1,1 M], добавлен 03.06.2012

  • Концепції об'єктно-орієнтованого програмування. Методи створення класів. Доступ до методів базового класу. Структура даних, функції. Розробка додатку на основі діалогових вікон, програми меню. Засоби розробки програмного забезпечення мовами Java та С++.

    курсовая работа [502,5 K], добавлен 01.04.2016

  • Опис мови програмування PHP. Стратегія Open Source. Мова розмітки гіпертекстових документів HTML. Бази даних MySQL. Обґрунтування потреби віддаленого доступу до БД. Веб-сервер Apache. Реалізація системи. Інструкція користувача і введення в експлуатацію.

    курсовая работа [42,9 K], добавлен 21.12.2012

  • Методи первинної обробки даних - згладжування та характеристика сплайнів. Загальна характеристика об'єктно-орієнтованої мови Java. Принципи побудови графічного інтерфейсу. Розробка алгоритму програми та інтерфейсу користувача програмного продукту.

    дипломная работа [3,3 M], добавлен 10.10.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.