Гекс – основа багатьох бойових систем
розробка ігор
гекс - основа багатьох бойових систем

Гекс (гексогон) – шестигранник.
Але чи означає це, що клітина краща за шестигранник? Спробуємо розібратися.
Клітина - проста форма, що має чотири вершини і стільки ж сторін. Головнийплюс:простота розрахунку, порівняно з будь-якою іншою формою.
У шестигранника справи гірші, гекс має шість вершин і шість сторін.

Клітина та гекс - відмінності видно неозброєним поглядом.
Але є одна важлива перевага. Якщо розглянути клітинне поле, то придивившись, можна помітити, що не дивлячись, на те що, клітини «квадратні» сторони рівні і вершини рівновіддалені, відстань між суміжними клітинами різна. Не вірите? А ось погляньте на схему:

Порівнюємо поле з клітин з полем з гексів, переваги і недоліки очевидні.
Як видно, клітини мають не чотири, а вісім сусідів. Чотири сусіди мають спільну сторону з нашою клітиною, вони відзначені жовтим, а інша партія сусідів мають спільні вершини (цю команду я відзначив червоним). Так, сусіди по вершинах не такі очевидні, але вони є.
Тепер достатньо зробити прості візуальні вимірювання лінійкою, і ми бачимо наступне: відстань між центрами «сусідів по боках» менша за відстань «сусідів по вершинах». Таким чином, ми стикаємося з дуже серйозною, хоч і малопомітною проблемою – відстань між клітинами не єдина. Подібні проблеми викликають багато клопоту, коли у грі відстань відіграє роль.
То як вирішити проблему? Нам на допомогу приходять шестигранники. Поле з гексів, на тій же схемі і при застосуванні гексів, при правильному розташуванні осередків на полі, відстань між усіма сусідніми клітинами однакова, та й сусідів менше,їх лише шість.
Основні правила побудови поля із гексів.
На жаль, взяти і просто намалювати замість клітин гекси не вдасться. Алгоритм, що виконує побудову клітин, видасть вам вельми несподіваний результат. Тому потрібно перебудувати «клітинний» алгоритм під використання шестигранників.
І так, клітинний алгоритм виглядає приблизно так:
Цей цикл будує по вісім клітин у кожному ряду, вісім разів.
Природно, що в циклі задається усунення наступного ряду рівно на ширину клітини, що дозволяє будувати клітини "одна до одної".
У результаті ми отримуємо правильну структуру клітинного поля.
Для використання гексів варто врахувати основні правила:
1. «Кожен новий ряд зміщувати на половину розміру»
2. «Задавати напрямок усунення кожного нового ряду, спираючись на парність/непарність номера ряду».
Ось такі прості правила відіграють основну роль. Все інше, як і з клітинами, намалював, зрушив, намалював.
Але хотілося б докладніше зупинитись на другому правилі.
З першим майже все ясно, крім того, що треба вміти визначати, коли виникає створення нового ряду. Давайте спочатку код, а потім трохи лірики.
Алгоритм побудови поля заснованого на гексах
Псевдокод алгоритму:
Ось приблизно якось так. А тепер розповідаю, що ми тут наробили.
Розбір алгоритму
Ми маємо стартову позицію, де з'явиться перша клітинка поля. Від цієї позиції в циклах будуть будуватися всі інші клітини поля.
xStart та yStart це змінні зсуви, вони нам розповідають, куди змістити стартову позицію наступного ряду. По суті, вони надмірні, можна обійтися і без них, застосувавши відразу в циклі формулу, як у цьому рядку: «StartPositionX+= Size/2; », Але для наочності я їх залишив.
Стартує вкладений цикл і перевіряє змінну Chot, якщо вона помилкова, значить ряд непарний. У цьому випадку створювати ряд він буде без усунення, тому що перший ряд, від якого все будується теж є непарним.
Виконавши 8 проходів, внутрішній цикл завершується і передає управління зовнішньому. Як видно з коду, в цей момент відбувається зміна значення змінної Chet на протилежне значення, і наше непарне стає парним. З іншого боку, відбувається зміщення StartPositionX += Size/2; Ряд зміщується рівно на половину ширину сектора X, що задовольняє правилу номер 1.
Але на цьому не все. При другому проході, цикл знову запускає вкладеного побратима, і знову 8 секторів починають будуватися, з лише різницею – змінна Chet змінила значення, і отже виконується протилежна умова, де Chet == true.
І якщо ви помітили, в цьому варіанті, до позиції Y додається половина розміру сектора! Цією простою маніпуляцією нам вдалося зрушити наступний ряд на половину розміру, тобто ми виконали правило номер 2, змогли перевірити парність, і визначили необхідне зміщення.
Завершивши побудову другого (парного) ряду, програма знову змінить значення змінної, що відповідає за парність, і третій ряд (непарний) будуватиметься за правилами непарної побудови. А зміщення ряду X відбувається за звичайними законами, з тією лише різницею, що замість повної ширини, ми використовуємо тільки її половину.
Ось так просто і без особливого клопоту нам вдалося побудувати красиве поле з шестигранних полів. І повірте мені на слово, якщо не хочете перевіряти, чи відстань між суміжними секторами однакова, що вже сама по собі є великою справою! Тепер те, що навіть по діагоналі випущенийснаряд обов'язково досягне своєї мети, а не розірветься в «півсекторі» до об'єкта.