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

розробка ігор

гекс - основа багатьох бойових систем

гекс

Гекс (гексогон) – шестигранник.

Але чи означає це, що клітина краща за шестигранник? Спробуємо розібратися.

Клітина - проста форма, що має чотири вершини і стільки ж сторін. Головнийплюс:простота розрахунку, порівняно з будь-якою іншою формою.

У шестигранника справи гірші, гекс має шість вершин і шість сторін.

гекс

Клітина та гекс - відмінності видно неозброєним поглядом.

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

основа

Порівнюємо поле з клітин з полем з гексів, переваги і недоліки очевидні.

Як видно, клітини мають не чотири, а вісім сусідів. Чотири сусіди мають спільну сторону з нашою клітиною, вони відзначені жовтим, а інша партія сусідів мають спільні вершини (цю команду я відзначив червоним). Так, сусіди по вершинах не такі очевидні, але вони є.

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

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

Основні правила побудови поля із гексів.

На жаль, взяти і просто намалювати замість клітин гекси не вдасться. Алгоритм, що виконує побудову клітин, видасть вам вельми несподіваний результат. Тому потрібно перебудувати «клітинний» алгоритм під використання шестигранників.

І так, клітинний алгоритм виглядає приблизно так:

Цей цикл будує по вісім клітин у кожному ряду, вісім разів.

Природно, що в циклі задається усунення наступного ряду рівно на ширину клітини, що дозволяє будувати клітини "одна до одної".

У результаті ми отримуємо правильну структуру клітинного поля.

Для використання гексів варто врахувати основні правила:

1. «Кожен новий ряд зміщувати на половину розміру»

2. «Задавати напрямок усунення кожного нового ряду, спираючись на парність/непарність номера ряду».

Ось такі прості правила відіграють основну роль. Все інше, як і з клітинами, намалював, зрушив, намалював.

Але хотілося б докладніше зупинитись на другому правилі.

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

Алгоритм побудови поля заснованого на гексах

Псевдокод алгоритму:

Ось приблизно якось так. А тепер розповідаю, що ми тут наробили.

Розбір алгоритму

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

xStart та yStart це змінні зсуви, вони нам розповідають, куди змістити стартову позицію наступного ряду. По суті, вони надмірні, можна обійтися і без них, застосувавши відразу в циклі формулу, як у цьому рядку: «StartPositionX+= Size/2; », Але для наочності я їх залишив.

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

Виконавши 8 проходів, внутрішній цикл завершується і передає управління зовнішньому. Як видно з коду, в цей момент відбувається зміна значення змінної Chet на протилежне значення, і наше непарне стає парним. З іншого боку, відбувається зміщення StartPositionX += Size/2; Ряд зміщується рівно на половину ширину сектора X, що задовольняє правилу номер 1.

Але на цьому не все. При другому проході, цикл знову запускає вкладеного побратима, і знову 8 секторів починають будуватися, з лише різницею – змінна Chet змінила значення, і отже виконується протилежна умова, де Chet == true.

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

Завершивши побудову другого (парного) ряду, програма знову змінить значення змінної, що відповідає за парність, і третій ряд (непарний) будуватиметься за правилами непарної побудови. А зміщення ряду X відбувається за звичайними законами, з тією лише різницею, що замість повної ширини, ми використовуємо тільки її половину.

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