Ізометричне виявлення зіткнень


11

У мене виникають проблеми із спробою виявити зіткнення двох ізометричних плиток.

Я спробував побудувати лінії між кожною точкою на плитці, а потім перевірити, чи немає перехоплювачів ліній, але це не спрацювало (можливо, через неправильну формулу)

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

Я не шукаю коду, лише деякі рекомендації щодо найкращого способу досягнення виявлення перекриття


4
Що саме ти намагаєшся зробити? Виявити, коли миша перебуває над плиткою, або виявляє, чи перекриваються два одиниці? Якщо це пізніше, вам слід подумати над тим, щоб відокремити свою «гру» від «графіки»
Джон Макдональд,

Мені потрібно зробити це, коли бічна плитка, що рухається, потрапила в нерухливу плитку, рухається плитка зупиняється. Єдине, з чим я маю проблеми - це тест на зіткнення. Я міг би використовувати пов'язаний ящик, але мені потрібно зіткнення бути точним.
Кріс Крі

Відповіді:


23

Я піду прямо і скажу, що я не знаю, як вирішити проблему, яку ви описали в питанні (виявлення зіткнення між прямокутниками у формі плитки), але я можу вам сказати, як інші вирішували її в минулому :

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

Загальна думка полягає в тому, що світ ігор повністю зберігається в пам'яті, за лаштунками, це просто цифри, посилання та логіка. Те, що ви малюєте ігровий світ ізометричним, не має значення. У вашому ігровому світі не повинно бути поняття ізометричного чи квадратного, або навіть якщо екран малюється як 3D. Про все це береться, коли ти малюєш світ ігор на екран (він же світ екрану ). Ігровий світ повинен зберігатися та підтримуватися найпростішим способом, який має сенс для гри, в ізометричних іграх ви, як правило, повністю ігноруєте той факт, що це iso, а натомість зберігаєте позиції так, ніби ви використовуєте сітку, орієнтовану на вісь. У більшості ігор будуть методи перетворення координат між двома світами, я називаю свій ScreenToWorld(x, y)іWorldToScreen(x, y). Перетворення часто проводиться з математикою Matrix, але може бути досягнуто іншими способами. Ви будете використовувати ScreenToWorld під час використання миші та WorldToScreen під час малювання.

Є кілька переваг у розділенні ігрового світу та світу екрану . Однією з переваг є те, що виявлення та рух зіткнень все відбувається в ігровому світі, і тому, як правило, досить прямо, тому що ви не маєте справу з похилою сіткою, косими координатами, або де знаходиться екран тощо. У вашому випадку , ви матимете справу з прямокутниками та квадратами, розташованими по осі. Після оновлення ігрового світу ви намалюєте зображення екрану на екрані, ключове слово: представлення. Спочатку це може здатися контрінтуїтивним, але ваш екран є лише відображенням того, що відбувається в ігровому світі. Це робить можливими такі речі, як виділені сервери та клієнти, подібні до терміналів.

FreeCiv - це насправді чудовий приклад усіх цих речей. Ви можете переглянути той самий точний світ, що і будь-який із: квадратну сітку Північ / Південь, Ізометричну або навіть Шестнадцятку. У кожній грі, яку ви запускаєте, є виділений сервер, який працює у фоновому режимі, навіть для однокористувацьких ігор, тому клієнт - це також лише порт дисплея, не більше того.

Короткий виклад історії: відокремлення ігрового світу та логіки від екранного світу спрощує логіку гри, зменшує ігрове <-> з’єднання дисплея та, в свою чергу, робить виявлення зіткнень між плитками "iso" простішими в обробці та простішими для візуалізації.


Дякую за добре пояснену відповідь, я розділяв логіку в тому, що було намальовано, і що відбувається на задньому плані, але я ставився до всього як до похилої сітки.
Кріс Крю

1
Для людей майбутнього; графіка - це інтерпретація даних. Чотири основні частини гри: логіка, дані, введення, вихід. Уникайте збивати їх разом. Також відмінна відповідь Іван, +1
Aarowaim

9

Відповідь Джона цілком правильна, але я спробую пояснити це по-іншому:

Не існує ізометричного виявлення зіткнення.

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

Це більш філософське питання: чи дерево, що падає в лісі, все-таки насправді стикається з землею, коли там нікого немає?

Звичайна мудрість сказала б: Так. Не має значення, як ти на це дивишся. Речі стикаються у світовому просторі, а не у просторі зору.


2
+1 Добре кажучи. "Немає ізометричного виявлення зіткнень"
Джон Макдональд

1
Дякую, я щойно сказав, що ви вже сказали. Але трохи інакше.
MarkR

0

Ви можете спробувати виділити масив пікселів, що складають растрові карти кожного значення getRGB () кожного окремого пікселя. Порівнюйте значення з твердженням if, якщо рамки плитки є окремим кольоровим значенням, ніж значення, яке представляє плитка (вода, пісок, трава). Це для базової ізометричної сітки. Або ви можете мати два шари самої карти. Один шар, що містить на зразок зеленого екрана, що малює контури кожного представника об'єкта, що стикається, а другий шар буде самою картою.

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

Я б розглядав ідеальне зіткнення пікселів та розуміння масивів растрових зображень. Кожен прямокутник являє собою межі, що містять реплікаційні дані, подібні до відбитої пам’яті, кожна подія спрацьовує залежно від того, де об’єкт відображений у місці чи векторі. Кожна точка на екрані знаходиться на двовимірній площині лише тієї глибини тіні, що створює ілюзію, що об’єкт представляє себе як 3D. Перетворення фігур у косому дають сенс, що об’єкт знаходиться під кутом. Існує центральна точка, де камера представляє її, щоб побачити все, що переноситься навколо цієї центральної точки, віддаляючись від неї, зменшуючись у розмірі або рухаючись ближче до неї, збільшуючись у розмірах.

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