Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Games

Головні відомості про ігрову петлю

Difficulty:BeginnerLength:MediumLanguages:

Ukrainian (українська мова) translation by Nadia Gonzales (you can also view the original English article)

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

Ви, ймовірно, грали в настільну гру «Спуски и драбини» 

(Фото належить incurable_hippie с Flickr)

Кожний гравець кидає кості та просувається вперед на певну кількість квадратів. В залежності від квадрату, на якому опинилися гравці, вони можуть або спуститися донизу, або піднятися уверх на декілька кроків. Гравець виграє гру, коли добирається до останнього квадрату. Таким чином, якщо ви на вищевказаному зображенні потрапляєте на 6 квадрат, то піднімаєтеся на чотири квадрати вгору; якщо – на 19, то спускаєтеся на 4 квадрати; якщо – на  64, то виграєте гру.

Таким чином, якщо ви на вищевказаному зображенні потрапляєте на 6 квадрат, то піднімаєтеся на чотири квадрати вгору; якщо – на 19, то спускаєтеся на 4 квадрати; якщо – на  64, то виграєте гру.

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

ВИ, скоріше за все, почали би зі створення масиву для зберігання значень квадратів. У багатьох елементах будуть зберігатися , проте в декількох будуть зберігатися позитивне число або негативне:

Примітка: Нижче наведено псевдокод (* мова, що нагадує мову програмування і яку використовують для опису структури програми. Тут і надалі примітка перекладача) (а не код AS3 (* ActionScript 3.0 – об'єктно-орієнтована мова програмування, один із діалектів ECMAScript, що додає інтерактивність, оброблення даних та багато іншого до вмісту Flash-застовувань)):

.... і так далі. Потім у вас була би функція для просування гравця на кількість кроків, що випала на гральній кості:

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

У цій функції, takeATurn(), міститься головна логіка гри «Спуски и драбини» для одного гравця. Але як ми запускаємо цю функцію? Мається декілька різних варіантів.


Запускаємо функцію на виконання при виконанні гравцем дій

Ми могли би розмістити на екрані кнопку та зробити так, щоб кожного розу при кліку по ній викликалася функція takeATurn(). Якщо ви коли-небудь грали в Facebook Scrabble (* "Скрабл", гра в слова (суть якої полягає у складанні слів на дошці в клітину за правилами кроссворда; руський аналог - гра «Ерудит") або Words With Friends, то бачили цей варіант у дії.


Запускаємо функцію на виконання при закінченні певного терміну

Ми можемо зробити так, щоб takeATurn() запускалася на виконання кожні 60 секунд.

На справі цей варіант реалізувати трохи складніше, ніж може здатися. На практиці ми ніколи не побачимо гри без яких-небудь дій з боку гравця; без взаємодії з гравцем її не можна буде вважати справжньою грою. Проте у деякі ігри залучено елемент «календарного часу». Розглянемо гру FarmVille»: ви, гравець, саджаєте свої культури, і потім кожні декілька хвилин (або годин) вони розвиваються трохи дальше, від насіння до проростків і далі у взрослі форми. трохи дальше, від насіння до проростків і далі у взрослі форми. У деяких режимах Civilization вам надається певна кількість часу для виконання всіх ваших дій для одного «шагу»; по їх закінченні запускається функція з основною логікою гри.


Використовуємо обидва варіанти

В деяких іграх використовуються обидва варіанти: наприклад, в Mafia Wars є ресурс під назвою  «energy», одна одиниця якого кожні п'ять хвилин; для здійснення дій у грі вам необхідний цей ресурс, тому на функцію з основною логікою гри, що знову запускається при виконанні гравцем дій, просто накладаються обмеження у часі.

Це загальний принцип для більшості ігор: один фрагмент коду, що містить головну логіку угри, виконується регулярно. Ми називаємо його ігровим циклом.

Також є термін для дії або періоду часу, по закінченні  якого запускається код з основною логікою гри – tick (* тікання) (на зразок звука, що дають часи).

Таким чином в Civilization tick – кожні п'ять хвилин. В Words With Friends після виконання вашого ходу викликається tick. Іншими словами, ігрова петля запускається один раз після tick.


Як складаються срави у грі Mario?

Не схоже, що SSuper Mario Bros відноситься до якої-небудь з цих категорій.  Mario реагує на дії гравця... і при цьому усі події продовжують відбуватися без необхідності вашої участі (магічні гриби переміщуються, час на таймері виходить. об'єкти падають). Чи є в Mario дві ігрові петлі?

Ні. Є тільки одна петля.

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

Такі ж справи і з Mario Если вы нажмете кнопку Jump (* прыжок) во время одного tick, то в следующей итерации игровой петли Mario начнет прыгать.

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


Чи все контролюється за допомогою ігрової петлі?

Вся логіка гри реалізується в ігровій петлі. Проте у грі є не тільки логіка, але й інші компоненти.

На приросовку графіки комп'ютер витрачає багато ресурсів. Давайте припустимо, що в нас є action game, в якій tick рівний 1/60 секунди; завдяки цьому в грі повинно буде виникнути уявлення, неначе реагування в грі на дії ігрока відбувається плавно. Але що відбудеться, якщо комп'ютер гравця занадто повільний для виконання всього коду логіки гри та прорисовки всього що необхідно на екран за 1/60 секунди? Але що відбудеться, якщо комп'ютер гравця занадто повільний для виконання всього коду логіки гри (реагування на ввід гравця, симуляція гравітації, виконання всіх підпрограм AI (* штучний інтелект)) та прорисовування всього що необхідно на екран за 1/60 секунди?

У цьому випадку ми можемо використовувати дві окремі петлі: ігрову та петлю прорисовування графіки. Потім ми можемо виконувати петлю прорисовування графіки з набагато меншою частотою, ніж ігрову; наприклад, ми оновлюємо екран у два рази рідше, тобто кожні 1/30 секунди.

Кількість  Давайте розглянемо  shoot-'em-up: на декількох перших рівнях на екрані буде дуже мало кораблів, завдяки чому на гравця буде невелике навантаження, тоді як на останніх рівнях на екрані може бути багато кораблів суперника та сотні снарядів, що одночасно літають на тій самій сцені. В ігровій петлі повинно буде бути обчислено., як всі ті об'єкти повинні будуть рухатися, і завдяки петлі прорисовки графіки кожний повинен буде відобразитися, так що якщо на початку гри ще можливо виконати як ігрову петлю, так і петлю прорисовки графіки кожні 1/60 секунди, то наприкінці доведеться чимось пожертвувати.

Звичайно простіше сповільнити петлю прорисовування графіки, ніж ігрову петлю, якщо вам необхідно вибирати. Якщо ви регулюєте тривалість tick ігрової петлі, то вам необхідно буде підрегулювати все у вашій грі, що залежить від часу; якщо Mario бігає зі швидкістю 20 пікселей/секунду, и тривалість tick в розроблюваній вами грі дорівнюється 1/60 секунди, то вам доведеться переміщувати його на 1/3 пікселя за tick. Якщо ви переналаштуєте ігрову петлю так, щоб довжина tick була 1/30 секунди, то вам доведеться пристосувати переміщення Mario так, щоб він рухався зі швидкістю 2/3 пікселі/секунду – такі перебудування необхідно буде зробити тільки через одну невелику зміну, а ще ж потрібно постійно виконувати обчислення для фізичного середовища та підпрограм AI.

Через це ігри часто налаштовані на підтримку постійної довжини ігрової петлі, і якщо необхідні додаткові ресурси, то здійснюється сповільнення петлі прорисовування графіки. Якщо ви коли-небудь увімкнете лічильник FPS (* frames per second – кадрів за секунду; число разів, яке петля прорисовування графіки виконується за секунду) в first person shooter (* шутер від першої особи; жанр комп'ютерних ігор, в яких ігровий процес засновується на боях з використанням вогнепального або будь-якого іншого зброї с поглядом від першої особи таким чином, щоб гравець сприймав те, що відбувається, очима протагоніста (головна діюча особа)), то повинні будете побачити, що швидкість петлі прорисовування графіки змінюється в залежності від того, скільки елементів відображується на екрані; частота оновлення петлі прорисовування графіки підлаштовується автоматично. У грі може бути тремтіння – як при перегляді онлайн-трансляції відео при повільному з'єднанні – проте до того, поки гра не буде виконуватися на комп'ютері з набагато меншими потужностями, ніж передбачав розробник, всі об'єкти у світі гри будуть продовжувати рухатися та взаємодіяти з передбачуваною швидкістю.

Для ознайомлення з чудовою статтею, в якій роз'яснюється робота моделі виконання фреймів во Flash, відвідайте наш пост Sean Christmann's на 'Elastic Racetrack'.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.