Як створити гру Понг - hyperPong | hyperPad Documentation

Loading...

Logo
DocumentationПосібникиЯк створити гру Понг - hyperPong
Посібники

Як створити гру Понг - hyperPong

Last updated July 10, 2019

Video_2019-07-31__5_25_47_PM.s.gif

Примітка: У кінці цієї статті ви можете знайти завершений файл проекту для цього навчального посібника.

Вступ

У цьому навчальному посібнику ми створимо гру, схожу на Понг, з нуля. Ми розглянемо деякі більш розвинуті функції та поведінки у hyperPad, тому цей навчальний посібник передбачає, що ви маєте базові знання про редактор hyperPad. Якщо ви вважаєте, що потрібно більше ознайомитися зі створенням гри з нуля, спершу ознайомтеся з Повним посібником - Створення платформи гри .

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

У нашій грі Понг ми включимо можливість грати в режимі 1 гравець (Гравець проти AI), 2 гравці (Гравець проти Гравця) або 0 гравців у режимі «Глядач» (AI проти AI).

Частина 1: Налаштування проекту та головне меню

Давайте почнемо зі створення нового проекту.

Відкрийте меню Проекти у hyperPad і натисніть Новий проект. Дайте вашому проекту назву і натисніть Далі. Орієнтацію можна залишити за замовчуванням як горизонтальну. Для цього навчального посібника підтримка пристрою встановлена на iPad 4:3. На наступному екрані оберіть «Перспектива пташиного ока» та залиште решту за замовчуванням.

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

Натисніть кнопку меню проекту/сцени і натисніть кнопку шестерні біля нашої «Сцена 1».

Photo_2019-07-10__5_32_10_PM.s.jpg

Photo_2019-07-10__5_34_50_PM.s.jpg

Натисніть опцію Налаштування і перейменуйте нашу сцену на «Головне меню». Натисніть Зберегти, щоб зберегти та закрити вікно налаштувань.

Photo_2019-07-10__5_36_34_PM.s.jpg

Далі, щоб залишити традиції ранніх ретро-ігор, таких як аркадний Понг, ми можемо зробити наш фон чорним.

Натисніть кнопку Налаштування сцени і виберіть Фон. Натисніть кнопку «Змінити колір» і встановіть його на чорний (#000000FF).

Photo_2019-07-10__5_41_52_PM.s.jpg

Photo_2019-07-10__5_43_22_PM.s.jpg

Тепер давайте додамо заголовок до нашого головного меню. Натисніть кнопку Спеціальні об'єкти та виберіть Мітка.

Photo_2019-07-15__2_45_50_PM.s.jpg

Photo_2019-07-15__2_46_33_PM.s.jpg

Введіть назву вашої гри в текстовому полі (для цього навчального посібника було введено «hyperPong»), встановіть розмір шрифту на щось велике, але не надто велике. Для заголовка «hyperPong» 72 пункти - це хороший розмір. Змініть колір на білий (#FFFFFFFF) і розмістіть його по центру меню ближче до верху.

Photo_2019-07-15__2_51_39_PM.s.jpg

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

Частина 2: Налаштування ігрової сцени та ракетки

Натисніть кнопку меню проекту і натисніть «Додати сцену». Назвіть її «Гра» і натисніть Створити. Тепер на сцені гри ви повинні бачити порожнє полотно. Як ми і робили зі сценою Головного меню, натисніть кнопку Налаштування сцени і змініть фон на чорний (#000000FF).

Давайте почнемо створювати наші гравецькі ракетки. Створіть порожній об'єкт, перейшовши до кнопки Спеціальні об'єкти і вибравши «Порожній об'єкт». Змініть його колір на білий (#FFFFFFFF) і переконайтеся, що повзунок непрозорості повністю включений.

Photo_2019-07-15__3_07_37_PM.s.jpg

Перейменуйте об'єкт на «Гравець-1» і встановіть його режим фізики на Фізика, залишивши параметр Прохідний включеним.

Photo_2019-07-15__3_12_23_PM.s.jpg

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

У властивостях об'єкта Гравець-1 перейдіть на вкладку Трансформація і встановіть масштаб X на 25% та перемістіть його вліво на ігровому полі.

Photo_2019-07-15__3_37_01_PM.s.jpg

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

Photo_2019-07-15__5_40_57_PM.s.jpg

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

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

У розділі Користувацькі елементи помістіть контейнер прямокутника. Це зберігатиме, в якому напрямку буде рухатися ракетка. Таким чином, як гравець, який контролює джойстик, так і AI, який виконує обчислення, можуть рухатися, змінюючи це одне значення. Його значення за замовчуванням має бути встановлено на 0. Також гарна думка дати йому хорошу назву, «Напрямок руху» здається доречним.

Photo_2019-07-17__1_17_12_PM.s.jpg

З обраним контейнером прямокутника натисніть кнопку «Змінити вхідне поле» і натисніть Так. Це створить поведінку «Встановити вхідне поле» для контейнера прямокутника, щоб ми могли змінити його значення, коли нам це потрібно. Підключіть «Встановити вхідне поле» до аналогового джойстика.

Photo_2019-07-17__1_42_32_PM.sjpg

Photo_2019-07-17__1_43_28_PM.sjpg

Оберіть поведінку «Встановити вхідне поле» та перетягніть вихідне значення з аналогового джойстика у поле «Нове значення». Виберіть властивість «y». Тепер контейнер прямокутника Напрямок руху буде відстежувати, наскільки далеко гравець рухає джойстик вгору чи вниз (вісь y).

Photo_2019-07-17__1_44_16_PM.sjpg

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

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

Натисніть властивість об'єкта, щоб змінити її, і виберіть джойстик. Вам може знадобитися вибрати глобальний рівень UI, щоб вибрати його. Коли він вибраний, натисніть кнопку перевірки. Тепер поведінка повинна показувати джойстик як відстежуваний об'єкт.

Photo_2019-07-17__1_47_54_PM.sjpg

Photo_2019-07-17__1_48_31_PM.sjpg

Натисніть на «Встановити вхідне поле», яке ми створили раніше, і дублюйте його. З дубльованою поведінкою «Встановити вхідне поле» підключіть його до поведінки «Зупинивши торкання» і встановіть його властивість «Нове значення» на 0.

Photo_2019-07-17__1_50_08_PM.sjpg

Photo_2019-07-17__1_52_22_PM.sjpg

Тепер наш контейнер змінної Напрямок руху відстежуватиме рухи вгору та вниз джойстика і скине його до 0, коли джойстик буде відпущено. Це дає нам чудовий спосіб сказати нашій ракетці, як рухатися, тож давайте продовжимо і дамо нашій ракетці деякий рух.

У розділі Користувацькі елементи помістіть поведінку таймера. У його властивостях встановіть інтервал на 0. Цей таймер виконуватим те, що завгодно, даючи нам можливість оновлювати рух ракетки дуже часто.

Photo_2019-07-17__2_27_54_PM.sjpg

Перед встановленням швидкості ракетки, ми хочемо переконатися, що значення для контейнера Напрямок руху обмежене в розумних межах, на випадок, якщо воно стане занадто високим або занадто низьким. В іншому випадку, наша ракетка буде рухатися занадто швидко в деяких випадках.

У розділі Логіка помістіть поведінку Мінімум і Максимум. Підключіть поведінку Мінімум до таймера, а Максимум до Мінімуму. У вас має бути щось на зразок цього:

Photo_2019-07-17__2_30_08_PM.sjpg

У властивостях поведінки Мінімум встановіть перше значення на вихідне значення поведінки Напрямок руху, а друге значення на 1.

Поведінка Мінімум виведе найменше число, яке їй дано. Отже, якщо значення напрямку руху перевищує 1, воно виведе 1. Інакше, воно просто виведе значення Напрямок руху.

Photo_2019-07-17__2_31_06_PM.sjpg

У властивостях поведінки Максимум встановіть перше значення на результат Мінімуму, а друге значення на -1.

Поведінка Максимум виведе найбільше число, яке їй дано. Отже, якщо значення Напрямок руху нижче -1, воно виведе -1. Інакше, воно виведе значення Мінімуму (яке або 1, або Напрямок руху, яке менше).

Photo_2019-07-17__2_32_46_PM.sjpg

Усе це означає, що обчислене значення Максимуму фактично є значенням Напрямок руху, обмеженим між -1 і +1. Це дає нам повний контроль над швидкістю, з якою може рухатися ракетка!

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

Снова у розділі Логіка, помістіть поведінку Множити значення і підключіть її до поведінки Максимуму. Для першого значення встановіть результат поведінки Максимуму. Для другого значення встановіть хороше значення «максимальної швидкості».

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

Photo_2019-07-17__2_34_52_PM.sjpg

Поведінка Множити значення тепер дає нам хороший діапазон швидкості, від -20 до +20.

Тепер саме час встановити швидкість ракетки. У розділі Фізика додайте поведінку «Встановити швидкість» і підключіть її до поведінки Множити значення. Встановіть поле «x» на 0, а поле «y» на результат виходу поведінки Множити значення.

Photo_2019-07-17__2_37_11_PM.sjpg

Спробуйте це! Коли ви граєте у гру, ракетка повинна рухатися, коли ви переміщаєте джойстик вгору та вниз.

Video_2019-07-17__2_39_15_PM.sgif

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

Частина 3: Межі гри

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

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

Натисніть кнопку Спеціальні об'єкти і створіть новий порожній об'єкт. Натисніть на новий порожній об'єкт, щоб відкрити його властивості.

Залиште його фізичний режим встановленим на Стіна і вимкніть параметр Прохідний. Встановіть його колір, щоб ми могли візуально бачити його, непрозорий темно-сірий (#1F1F1FFF) виглядає добре. Встановіть тертя на 0% та відскок на 100%.

Photo_2019-07-17__4_14_41_PM.sjpg

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

Photo_2019-07-23__2_17_57_PM.sjpg

Тепер дублікат стіни і перемістіть копію вниз.

Знову дублікат і встановіть його масштаб X на 200%. Потім розтягніть висоту, щоб відповідати екрані і помістіть її зліва від екрану.

І знову, дублікат вертикальну стіну і перемістіть її праворуч від екрану. Тепер у вас має бути повністю закрите ігрове поле:

Photo_2019-07-23__2_21_51_PM.sjpg

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

Те, що ми зробимо, щоб реалізувати цю поведінку, - це перевірити позицію гравця в порівнянні з позицією стіни. Якщо це правда, то перемістіть гравця назад у ігрову зону.

Для того, щоб трохи спростити це для реалізації, натисніть на верхню стіну та змініть точку прив’язки Y на 0%. Це зафіксує положення стіни до самого нижнього її частини. Вам можливо потрібно буде розблокувати поля прив’язки, натиснувши на значок замка.

Photo_2019-07-23__2_31_57_PM.sjpg

Аналогічно, для нижньої стіни змініть точку прив'язки нижньої стіни на 100% цього разу. Це закріпить положення нижньої стіни до самої верхньої її частини.

Photo_2019-07-23__2_34_05_PM.sjpg

Тепер ми готові реалізувати нашу поведінку перевірки меж. Натисніть на ракетку і відкрийте її редактор поведінки.

Розпочніть з того, щоб помістити поведінку отримає обмеження з розділу Логіка. Вона повинна за замовчуванням використовувати ракетку. Ця поведінка дасть нам нижні/ліві координати і розмір ракетки.

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

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

Photo_2019-07-23__4_05_38_PM.sjpg

Для кожної поведінки Отримати позицію розгорніть і підключіть поведінку Віднімання значень з розділу Логіка.

У властивостях для Віднімання значень, підключених до Отримати позицію нижньої стіни, встановіть перше значення на результат «позиція_y» для нижньої стіни. Потім встановіть друге значення на «y» для Отримати обмеження.

Photo_2019-07-23__4_08_07_PM.sjpg

Тепер для властивостей у іншій поведінці Віднімання значень підключеній до Отримати позицію верхньої стіни, встановіть перше значення на «позиція_y» для верхньої стіни. Потім встановіть друге значення на результат «Додати значення - верхню частину гравця».

Photo_2019-07-23__4_09_09_PM.sjpg

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

У розділі логіки опустіть та підключіть два Якщо поведінки для обох гілок поведінки.

Для якщо поведінки, підключеного до гілки нижньої стіни, встановіть перше значення на результат підключеної поведінки Віднімання значень. Встановіть умову на > ("Є більшим за") та друге значення на 0.

Для якщо поведінки, підключеного до гілки верхньої стіни, встановіть перше значення на результат підключеної поведінки Віднімання значень. Умову встановіть на < ("Є менше ніж") та друге значення на 0.

Обидві ці якщо умови продовжать виконання, якщо ракетка перевищить кожну стіну відповідно.

Photo_2019-07-23__4_10_39_PM.sjpg

Якщо ракетка перевищує стіну, ми хочемо примушувати зупинити ракетку від подальшого руху, скинувши швидкість ракетки до 0, а потім перемістивши її назад у ігрову зону.

У розділі Фізика помістіть поведінку «Встановити швидкість» для кожної гілки. Обидва встановлюють їх значення швидкості X/Y на 0.

Photo_2019-07-23__4_12_16_PM.sjpg

Тепер ми можемо штовхнути ракетку назад у гру. У розділі Трансформація помістіть поведінку «Перемістити на» для кожної гілки.

У кожній поведінці «Перемістити на» залиште значення «Перемістити на X» на 0 і встановіть значення «Перемістити на Y» на результат віднімання значень у їхніх відповідних гілках. Потім встановіть тривалість на 0 секунд (моментально).

Photo_2019-07-23__4_14_56_PM.sjpg

Photo_2019-07-23__4_15_23_PM.sjpg

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

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

Примітка: поведінка «Пакет поведінки» нічого не робить сама по собі і тільки використовується тут, щоб відзначити «початкову точку» для перевірки, чи знаходиться ракетка поза межами.

Photo_2019-07-23__4_17_37_PM.sjpg

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

Photo_2019-07-23__4_19_44_PM.sjpg

Тепер щоразу, коли ракетка оновлює свою швидкість руху, поведінка Виконати «пострибує» виконання до нашого нового ланцюга поведінки Перевірки меж, де буде перевірено, чи вийшла ракетка за межі!

Тестуйте це і дивіться, як воно працює!

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

Photo_2019-07-23__4_28_37_PM.sjpg

Тепер, коли у нас є місце, давайте створимо м'яч!

Частина 4: Створення м'яча

Повертаючись до редактора сцени, створіть порожній об'єкт. Встановіть його фізичний режим на Фізика і вимкніть Параметр Прохідний, щоб м'яч міг рухатися та фізично зіткнутися з границями. Встановіть тертя на 0% і відскок на 100%. Встановіть колір на білий (#FFFFFFFF). Для простоти також можна перейменувати цей об'єкт на «М'яч».

Photo_2019-07-25__1_50_38_PM.sjpg

У вкладці Трансформація встановіть масштаб на X=25% і Y=25%, а позицію на X=50% і Y=50%.

Photo_2019-07-25__2_07_07_PM.sjpg

Наступним кроком відкрийте редактор поведінки для м'яча і дамо йому певний рух. У розділі Користувацькі елементи помістіть поведінку Очікування і встановіть її на 3 секунди.

Потім помістіть поведінку Випадкове число з розділу Логіка і з'єднайте її з поведінкою Очікування. Для першого значення було поставлено -1.0, а для другого значення - 1.0. Обов'язково включайте «.0», щоб воно випадково вибирало число між -1.0 і 1.0, включаючи десяткові дроби, інакше воно вибере лише цілі числа. Це буде служити випадковим "направленням удару", коли м'яч спочатку запускається.

Photo_2019-07-25__2_09_17_PM.sjpg

Далі, підключіть поведінку Застосувати силу з розділу Фізика. Встановіть Силу X=-1, а Силу Y на результат Випадкового числа. Це стане напрямком, в якому м'яч буде рухатися, але 1 ньютон - це не багато сили, тому ми повинні також змінити множник. Встановіть множник на 150 і протестуйте гру, щоб подивитися, чи це занадто швидко або повільно. Якщо так, ви можете змінити цей множник відповідно. М'яч повинен почати рухатися через 3 секунди під час гри, наче його подали.

Photo_2019-07-25__2_09_55_PM.sjpg

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

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

Photo_2019-07-25__2_23_21_PM.sjpg

Перед створенням поведінок для зіткнення з ракеткою, повертаючись до редактора сцени, натисніть на ракетку і в її властивостях перейдіть на вкладку міток. У текстовому полі введіть "Ракетка" і натисніть кнопку +, щоб додати мітку до ракетки.

Photo_2019-07-25__2_25_56_PM.sjpg

Тепер повертайтеся до редактора поведінки м'яча. У розділі Об'єкт помістіть в будь-якому місці поведінку Взаємодія. У властивостях цієї поведінки натисніть на вкладці Мітки і виберіть мітку Ракетка, яку ми створили. Тепер, всякий раз, коли м'яч торкається будь-якого об'єкта з міткою "Ракетка", ця подія буде виконуватися.

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

З'єднайте поведінку Взаємодії з поведінкою Отримати швидкість з розділу Фізика. Після цього підключіть поведінку Множити значення з розділу Логіка. У першому значенні поставте результат «швидкість_x» з Отримати швидкість. Для другого значення визначте значення -1.03. Результат цієї множення значення буде негативна х-швидкість м'яча, а також 3% збільшення швидкості. Тож давайте застосуємо цю зміну наступною.

Photo_2019-08-01__5_27_07_PM.jpg

Підключіть поведінку Встановити швидкість з розділу Фізика до поведінки Множити значення. Встановіть його X швидкість на результат множення і залиште Y швидкість такою ж.

Photo_2019-08-01__5_37_26_PM.jpg

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

Воно все починає набирати обертів! М'яч і ракетка рухаються нормально, але напрямок м'яча не змінюється. Коли м'яч потрапляє в ракетку, він повинен змінювати їх напрямок; якщо м'яч торкається ближче до верхньої частини ракетки, то він має підніматися, а якщо м'яч торкнеться ближче до нижньої частини ракетки, то він має опускатися. Це додасть рівень складності, а також навичок, оскільки гравець(и) матимуть певний контроль, куди йтиме м'яч.

Щоб дізнатися, наскільки сильно ми повинні підняти м'яч, нам потрібно знайти різницю в положеннях між м'ячем і ракеткою. У розділі Трансформація помістіть два Отримати позиції і підключіть їх послідовно під Встановити швидкість. Перший Отримати позицію залишиться відстежувати м'яч за замовчуванням. Змініть другий Отримати позицію на вихід «ObjectB_ID» з поведінки Взаємодії.

Примітка:"ObjectB" у цьому випадку буде коло кілька ракеток, оскільки це другий об’єкт, відносно якого виконується зіткнення, в той час як перший об'єкт («ObjectA») - це м'яч.

Photo_2019-07-25__4_50_08_PM.jpg

Скиньте і підключіть поведінку Віднімання значень з розділу Логіка. Встановіть першу значення на результат «позиція_y» з першого Отримати позицію, що відстежує м'яч. Встановіть друге значення на результат «позиція_y» з другого Отримати позицію, що відстежує ракетку.

Photo_2019-07-25__4_56_07_PM.jpg

Потім помістіть і підключіть поведінку Застосувати силу з розділу Фізика. Встановіть значення сили X на 0, а Y на результат Віднімання значень. Розбіжності за позицією самі по собі не будуть дуже сильними, тому ми також маємо скорегувати множник. Спробуйте множник 50, і подивіться, як це буде в грі.

Photo_2019-07-25__4_59_42_PM.jpg

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

Ми майже закінчили повну реалізацію руху м'яча! Є ще одна невелика проблема; немає ніякого обмеження, як швидко може рухатися м'яч! Справді, граючи деякий час без скидання, м'яч може рухатися так швидко, що може фактично пройти через об'єкти. Ми повинні реалізувати обмеження на швидкість м'яча, щоб вона не досягала цієї надзвичайної швидкості.

Після поведінки Застосувати силу розмістіть і підключіть поведінку Отримати швидкість з розділу Фізика, щоб отримати нову швидкість м'яча. Під цим, розмістіть і підключіть поведінки Максимум і Мінімум в серії з розділу Логіка.

У властивостях Максимуму встановіть перше значення на результат «швидкість_x» з Отримати швидкість, а друге значення на -25. Це дасть результат, який є найбільшим значенням, яке дається.

Photo_2019-07-25__5_30_37_PM.jpg

У властивостях Мінімуму встановіть перше значення на результат Максимуму, а друге значення на 25. Це дасть результат, який є найменшим із значень швидкості м'яча між -25 і +25. Ні вище, ні нижче!

Photo_2019-07-25__5_37_16_PM.jpg

Тепер нам потрібно зробити те ж саме для Y швидкості м'яча. Розмістіть і підключіть ще один набір Максимум та Мінімум в серії. У нових властивостях Максимуму, встановіть перше значення на результат «швидкість_y» з Отримати швидкість, а друге значення на -10.

Photo_2019-07-25__5_37_16_PM.jpg

У нових властивостях Мінімуму, встановіть перше значення на результат нового Максимуму, а друге значення на 10. Це залишить рейт Y швидкості між -10 та +10. Ви можете змінити ці значення пізніше, якщо ви хочете!

Photo_2019-07-25__5_38_32_PM.jpg

Тепер, коли у нас є значення швидкості м'яча після обмеження, давайте застосуємо їх зараз. Знову помістіть і підключіть поведінку «Встановити швидкість» з розділу Фізика. У її властивостях, встановіть швидкість X на результат першого Мінімуму, а швидкість Y на результат другого Мінімуму.

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

Photo_2019-07-31__3_06_29_PM.sjpg

Частина 5: Штучний інтелект ракетки

Хоча було б нормально дублікувати ракетку і створити другий граючий ракетку, не було б класно, якби була можливість боротися проти AI замість гри на 2-х гравців? Звісно! У цій частині ми розглянемо спосіб надання ракетці AI, а також надання користувачу можливості грати у режимі 2 гравців або проти AI.

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

Ми також додамо деяку ентропію до Напрямок руху, або іншими словами, деяку випадковість. Таким чином, ми отримаємо деякі характеристики, схожі на людські, для AI. AI не буде відчувати себе так механічно і не буде просто грати гру вдосконалено.

Ось як ми визначимо наш AI:

  • AI рухатим, тільки якщо м'яч йде в їх бік.
  • Напрямок руху - це просто різниця між Y (вертикальною) позицією м'яча і ракетки, плюс певна ентропія.
  • Якщо м'яч зіткнеться з чимось (ракеткою, стіною чи будь-чим іншим), ентропія ракетки AI змінилася.
  • Ентропія базується на швидкості м'яча; чим швидше рухається м'яч, тим вищою буде значення ентропії, отже, тим менше точною буде ракетка.

Здається, досить просто, давайте перейдемо до роботи.

Натисніть на ракетку і вхідте до її редактора поведінки. Знайдіть вільне місце і помістіть нову поведінку таймера з розділу Користувацькі елементи. Встановіть таймер на 0 секунд. Для зручності ви можете змінити його назву на щось корисне, наприклад, «AI Think».

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

Photo_2019-07-29__2_20_45_PM.sjpg

Спочатку ми хочемо встановити Напрямок руху на 0, щоб ракетка зупинилася, коли ми не повинні рухатися. Натисніть на поведінку Напрямок руху, яку ми зробили у Частині 2, і натисніть кнопку Змінити поле вводу, щоб створити нову поведінку Установити Вхідне Поле. Підключіть поведінку Установити поле вводу до таймера AI Think і встановіть її властивість нового значення на 0.

Photo_2019-07-29__2_21_11_PM.sjpg

Photo_2019-07-29__2_21_37_PM.sjpg

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

Uq5g-w7Q.jpg

Таким чином, спочатку значення Напрямок руху встановлюється на 0, перш ніж продовжити з рештою поведінки AI.

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

.....