Які ваші улюблені гейми, що кодують конкретні ігри? [зачинено]


24

Я розпочну з « Швидкого зворотного квадратного кореня» Джона Кармака в Quake III:

float Q_rsqrt(float number) {

  long i;
  float x2, y;
  const float threehalfs = 1.5F;

  x2 = number * 0.5F;
  y = number;
  i = * ( long * ) &y;
  i = 0x5f3759df - ( i >> 1 );
  y = * ( float * ) &i;
  y = y * ( threehalfs - ( x2 * y * y ) );

  return y;

}

6
Це насправді не питання - принаймні, ви можете оголосити це на сторінці вікі спільноти ...
Рейчел Блюм

Зроблено, спільнотою.
гак

3
Викрутіть це! просто перейдіть з будь-яким кодом, створеним великим JC!
Адам Нейлор

3
До речі, зауважте, що є більш точне "магічне число", яке потрібно використовувати в функції швидкого зворотного квадратного кореня: 0x5f375a86 ( en.wikipedia.org/wiki/… )
Ricket

8
Також зауважте, що це не Джон Кармак.
Кай

Відповіді:


25

mapValue функція:

float mapValue( float inVal, float inFrom, float inTo, float outFrom, float outTo )
{
    float inScale = (inFrom != inTo) 
        ? ( ( inVal - inFrom ) / ( inTo - inFrom ) ) 
        : 0.0f;
    float outVal = outFrom + ( inScale * ( outTo - outFrom ) );
    outVal = (outFrom < outTo ) 
        ? clamp( outVal, outFrom, outTo ) 
        : clamp( outVal, outTo, outFrom );
    return outVal;
}

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

Ви можете використовувати його для нормалізації матеріалів:

float minDamage = 0.0f; float maxDamage = 300.0f;
float normalisedDamage = mapValue(damange, minDamage, maxDamage, 0.0f, 1.0f);

Або ви можете конвертувати з одного діапазону в інший:

float brakeStrength = mapValue(timeToCollision, 
    0.0f, 10.0f, // seconds
    1.0f, 0.2f // brake values 
    );

Зауважте у другому прикладі, що вихідний діапазон - це інший порядок до діапазону.

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


14

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

a ^ 2 + b ^ 2 = c ^ 2
(джерело: mathurl.com )

або

alt текст
(джерело: mathurl.com )

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

alt текст
(джерело: mathurl.com )


Ну якщо чесно, піфагорійська математика використовується ВСІМ над ігровим кодом, особливо двигунами, такими як фізичний код, код візуалізації, AI.
Нік Бедфорд

1
Правда. Ось чому це дорогоцінний камінь. ;)
MrValdez

4
Цікава варіація, коли ви дбаєте лише про відносні відстані. Тоді ви можете пропустити потенційно дорогий sqrtдзвінок і просто обчислити distance2 = x^2 + y^2.
mmyers

@mmyers - Ще одна чудова річ: якщо ви працюєте в просторі x ^ 2, відстань не просто відносна.
Стівен Еверс

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

13

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


10

Я маю йти з пристроєм Даффа . Це був перший блок коду, який буквально зробив мою щелепу. "Ви можете це зробити?!?"


О Боже мій. Окуляри! Вони нічого не роблять!
Рауль

Вкладене "робити час" всередині "комутатора" завжди змушує мене моргати. Навіть через 20 років ...
Андреас

1
-1. Мені це не подобається. Сьогодні це не дуже корисно (ви скористаєтесь memcpyнатомість, якщо хочете, щоб інші люди могли читати ваш код)
bobobobo

1
@JoeWreschnig чому б і ні? Memcpy завжди буде більш читабельним, портативним та, ймовірно, оптимізованішим.
якDD

1
@kaoD: Оскільки memcpy не еквівалентний пристрою Даффа - не важливо, наскільки "читабельний, портативний і, можливо, більш оптимізований", це якщо він не робить те ж саме! Сучасні конвеєри процесора, ймовірно, обійдуться краще без пристрою Даффа, ніж з ним через передбачення гілок та кешування інструкцій, але це не має нічого спільного memcpy.

7

Невеликий фрагмент C / C ++ з гри, яку я допоміг написати багато років тому:

(fill ? FillRect : DrawRect) (x, y, w, h, colour);

У моїй першій грі ( це ) мені потрібно було отримати доступ до більш ніж 1 Мб оперативної пам’яті, і, перш ніж інтернет вилетів, у мене не було жодної документації для XMS та EMS, які DOS-додатки використовували для отримання додаткової оперативної пам’яті.

Отже, я в кінцевому підсумку використав невеликий "бекдор", який представлений у 386 щодо сегментних регістрів. Зазвичай у реальному режимі адреса розраховувалася такою, seg*16+offяка обмежила вас 1Мб.

Однак ви можете перейти в захищений режим, встановити сегмент для адреси 4Mb, переключити назад, і за умови, що ви не записували в сегментний регістр (що було нормально, оскільки DOS використовував лише регістри сегмента 8086), ви могли отримати доступ до цілого 4 Мб як плоский адресний простір. Повернення до реального режиму було необхідне, якщо ви хочете скористатися послугами DOS.

Не було також багато розширювачів DPMI.


Практично працює в C # (потрібно оголосити тип делегата і вставити хоча б один
склад

Ви маєте на увазі 32-бітні режими адресації в реальному режимі? (тобто вимагає префікса розміру адреси). Ви впевнені, що потрібно було налаштувати дескриптор сегмента, і що він насправді не використовував сегментний регістр як звичайний 16 * FS + все, що завгодно? Я не думав, що сегменти навіть мають обмеження в 16-бітному режимі, лише базову адресу (16 * їх значення), тому ви не могли просто встановити FS на щось у 16-бітному режимі та використовувати [fs:esi]чи будь-що для доступу до будь-якого хотіли?
Пітер Кордес

Я цього не пробував і не писав жодного реального коду для 16-бітного режиму, лише 32 та 64 бітовий ASM, але це звучить дивно. Хм, правдоподібно, однак. Сучасні процесори, безумовно, кешують сегменти внутрішньо, і перезавантажують ці кеші лише тоді, коли ви пишете в сегменти рег., Можливо, саме так він зберігав базовий захищений режим + ліміт (якщо це насправді сталося, і ви не просто використовували 4 Мб, починаючи з 16 * FS).
Пітер Кордес

5

Особисто я є великим шанувальником Mersenne Twister за передбачувані випадкові числа, особливо якщо вам потрібно створити кілька по-різному нарізаних екземплярів Rand

http://en.wikipedia.org/wiki/Mersenne_twister


Mersenne Twister є приємним в тому сенсі, що це хороший генератор випадкових чисел, але це не особливо елегантно або круто (або швидко або легко здійснити). Для цього ви можете подивитися на en.wikipedia.org/wiki/Rule_30 .

1
ДОБРЕ загалом краще, ніж MT для більшості застосувань .. en.wikipedia.org/wiki/Well_equidistributed_long-period_linear
Jari Komppa

5

Ось один згаданий Крісом Крофордом (і, очевидно, використовується Атарі), який він називає "Графічним трюком":

LDA FIRST
EOR SECOND
AND CONTROL
EOR SECOND
STA OUTPUT

Прочитайте повну статтю для пояснення.


1
Це посилання зараз розірвано, тому це допоможе мати тут пояснення.
finnw

Спасибі. Він пішов і знову змінив свій веб-сайт. Я оновив посилання.
Ентоні

4

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


1
Одне з речей, які мені подобаються в програмуванні ігор, - це відійти від стандартного способу «правильності» GoF і просто зосередитись на чистому прекрасному швидкості! Це означає, що я бачив багато поганих реалізацій MVC в іграх, які приносять більше шкоди, ніж користі.
Iain

Я думаю, що шаблони дизайну мають своє місце. Хоча не стільки в іграх.
blissfreak

@blissfreak: Немає нічого особливого в ігровому програмуванні, що робить його деяким диким заходом, де шаблони не є звичайними. Вони смішно поширені, і ось кілька прикладів.
Стівен Еверс

4

Math.atan2 () надзвичайно корисний (разом із усіма тригами).


Це, боже! Я робив багато 3D і ніколи не потребував цього.
Skizz

+1, це єдиний спосіб перейти від компонентів вектора x + y до радіанового напрямку.
RCIX

1
@RCIX: Моя думка полягає в тому, що це перетворення непотрібне, тобто (x, y) -> кут, є векторне рішення будь-якої кутової задачі.
Skizz

6
Я б не називав голову стандартну функцію бібліотеки "дорогоцінним каменем".

1
@Skizz: Можливо для 3d, але я не знаю іншого способу взяти нормалізований вектор і витягти значення напрямку радіану. Що в цілому в 2D іграх.
RCIX

3

Щоб додати до піфагорійського самоцвіту вище ...
Я завжди кажу людям, що для 3d програмування їм потрібно знати лише:
- a ^ 2 + b ^ 2 = c ^ 2
- soscastoa (sin = протилежна сторона / нахилена сторона, cos = приєднана сторона / нахилена сторона, tan = протилежна сторона / прикріплена сторона)
- a. b = | a | * | б | * cos альфа
- a * b = | a | * | б | * sin альфа * одиничний вектор
Це може вирішити майже будь-яку 3d (або 2d) проблему, з якою ви стикаєтесь у розробці гри - 4 правила.
Звичайно, є приємніші способи, але це все може вирішити - я маю знати, я хак, який базував кар'єру на em.


5
re: soscastoa Я думаю, що більшість людей знає, що це sohcahtoa (замінюючи "нахилену сторону" більш конкретною, якщо, правда, більш незрозумілою, "гіпотенузою"). Язик витікає легше, і я думаю, таким чином легше запам’ятати.
Асмор

1
Я завжди віддаю перевагу «Старий арабський сат на верблюда та вию», оскільки середня школа (середній шкільний вік) це відбилася на моєму мозку.
Джордж Дакетт

Там також « S Омі O а.с. H Ippy C AME й H оголошення T розірвав O п ІДС»
blissfreak

3

Один з моїх улюблених - це версія мовної збірки «Життя» та весь опис її оптимізації в « Дзен оптимізації коду» Майкла Абраша.

Я б рекомендував будь-яку його книгу кожному, хто шукає кодування дорогоцінних каменів.

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