Що таке "логічний код гри?"


50

Я використовую C # / XNA, і мені вже не раз говорили, що не змішувати код оновлення з малюванням коду - і я впевнений, що це не так! Але чи могла б хто-небудь описати, що саме таке логічний код?

Як бачимо тут: http://blogs.msdn.com/b/shawnhar/archive/2007/07/25/understanding-gametime.aspx

[...] переконайтеся, що ви помістили всю свою логіку гри всередину методу оновлення (не в Draw!), і все буде працювати з приємною постійною швидкістю.

Я запитую це, оскільки швидкість моєї гри коливається відносно FPS. Повільний FPS дорівнює об'єктам, що рухаються повільно, і навпаки. І так, я включаю очікуваний position += speed * (float)gt.ElapsedGameTime.TotalSeconds;код.

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


Я думаю, ти мав на увазі position = speed * ...TotalSeconds. Зауважте, що це =не так +=. Якби це було так +=само, як ви вводили, то ваше положення злетіло б із екрана майже миттєво.
DrZ214

У мене є код, який виглядає як "позиція + = напрям * швидкість * ... TotalSeconds", і це працює дуже добре. Я, можливо, щось помилково ввів, але позиція = швидкість призначала б це оновлення. Ваш спосіб може працювати, але я маю такий код, як працює. (Зверніть увагу, що напрямок нормалізується)
Сором’язливий хлопець

Я думав gt.ElapsedGameTime.TotalSeconds- це кількість секунд, що минули від запуску програми (гри). Якщо ви помножите свою швидкість на це, то через 5 секунд гри ваша швидкість стане в 5 разів швидшою (за винятком спеціального випадку, коли швидкість встановлена ​​на 0). Не впевнений, що ви ще могли мати, що могло б зробити це неправдою, але я заінтригований.
DrZ214

1
Ага, це з моменту останнього оновлення. gamedev.stackexchange.com/questions/67968 / ...
Shyy Guy

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

Відповіді:


102

Чи це змінює стан вашого ігрового світу? Це логічний код.

Чи відображає він стан ігрового світу? Це код візуалізації.


Я перегляну свій код, щоб бути на 100% певним. Гарне пояснення, дякую.
Сором’язливий хлопець

38
Чи обробляє вхід? Код його контролера. Відокремте управління від логіки, щоб ви могли використовувати ту саму логіку з різними типами елементів керування. Наприклад, FPSInputController + CharacterMotor vs. AIInputController + CharacterMotor проти NetworkInputController (наприклад, інші гравці в екземплярі для багатьох гравців) + CharacterMotor. Мотор (логічний код) не байдуже, як він отримує вказівки, які він виконує, лише те, що вони поставляються (такий вид роз'єднання дозволяє легко переходити від гравця до AI бота (думаю, Left 4 Dead та простоюючих гравців) і назад, між іншим).
Draco18s

10
Драко підводить хороший момент. Є багато різних підрозділів, які ви можете ввести в код. Поділ Нільса - це те, що я б вважав архетипним поділом між логікою та візуалізацією, але ви побачите багато інших шарів. Справжня причина їх розділення на шари полягає в тому, що кожен шар складається з подібних дій, що вимагають схожого стилю коду з подібними вимогами. Наприклад, у багатьох іграх ви можете піти з ігрової логіки, зайнявши 2 або 3 кадри для завершення, але якщо ви не зробите кожну рамку, око користувача це швидко помітить.
Корт Аммон

Збереження їх допоможе вам керувати своїми вимогами, коли вони стануть джерелом напруги.
Корт Аммон

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

24

Ваша розлука правильна, якщо:

  • Виклик Draw () кілька разів поспіль без перекреслених дзвінків до Update () ніколи не призведе до видимих ​​змін між викликами.
  • Викликати оновлення () кілька разів поспіль без перекресленого дзвінка Draw () - це як гра в гру із вимкненим екраном: все рухається ідеально та послідовно, ви просто не можете його бачити.

5
Правильно написані Draw()можуть малювати різні малюнки в міру проходження часу. Наприклад, кадри анімованих спрайтів можуть продовжувати змінюватися. Також об’єкти можуть продовжувати візуально рухатися вперед, якщо код візуалізації використовує загальний трюк і додає velocity * time since last update / period of updateдо видимого положення об'єктів (при цьому їх реальне положення залишається незмінним).
HolyBlackCat

2
iffзначить, якщо-і-тільки-якщо?
BalinKingOfMoria

3
@HolyBlackCat: це сперечально. Що робити, якщо я хочу призупинити графіку? Що робити, якщо кадри анімації впливають на гру (анімація атак, відповідна скринькам показів тощо)? Візуальна інтерполяція все ще означає, що "час" (як у дельта-часі гри) проходить, але якщо час проходить, а ви не працюєте, Updateто що ще виходить із синхронізації? Пропущені входи гравців, мережеві події не обробляються тощо? Гра повинна бути відключена з одного годинника, з фіксованими "тиками" для ігрової логіки або фізики, отриманих з цього годинника, і отриманого графічного стану, що також керується цим самим годинником.
Шон Міддлічч

@SeanMiddleditch Я згоден, майже завжди ви можете писати Draw()таким чином, щоб він завжди малював одну і ту ж картину, коли дзвонив кілька разів поспіль. Слід зробити це, якщо можливо. Але бувають випадки, коли ви не знаєте, з якою частотою Draw()будете викликати. Наприклад, якщо ви хочете отримати повну підтримку (фактична 120 FPS) для нових моніторів 120 ГГц, і ви включаєте vsync. What if I want to pause graphics?Тоді ви передаєте 0 замість фактичного часу дельти до Draw().
HolyBlackCat

2
@HolyBlackCat: Ніщо, до чого я потрапляв, не перешкоджало б використанню візуалізації 120 Гц. Я абсолютно не рекомендував фіксовану ставку залучення; це просто любительсько. Повинен бути один глобальний ігровий годинник, дельта якого вимірюється у перерахунку на рамки візуалізації, які подають у значення накопичення для логічної галочки гри з фіксованою швидкістю. Цей глобальний годинник працює з графікою, включаючи інтерполяцію. Ви можете призупинити графіку, встановивши шкалу годинника на 0. Ви можете мати ієрархічні годинники, так що, наприклад, користувальницький інтерфейс все ще працює і анімує, поки інтерполяція символів зупиняється теж дуже-дуже легко.
Шон Міддлічч

7

Сенс тут - розділення модельних речей, які не є моделлю.

Логіка гри - це модель, про яку йдеться в

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

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

Аналогічно стосується логіки гри.

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

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

Логіка гри - це річ, яка ніколи не змінюється, незалежно від форми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.